maven插件maven-jar-plugin构建jar文件的详细使用
作者:老码龙
前言
maven-jar-plugin插件时maven中最常用的插件,也是maven构建Java程序执行包或者依赖包的默认插件,大部分情况下我们不需要对其进行配置,但在特殊情况下,我们可以通过配置来定制我们的jar包。
一、使用方式
大部分情况下,我们的配置如下:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.4</version> </plugin>
而且这里的版本号是可选的,如果不配置版本号,maven会自动去寻找最新的版本。
二、常用配置详解
1.classesDirectory
这个表示class文件的目录,默认值是:${project.build.outputDirectory}也就是target目录下的class目录,当然我们也可以指定其他目录。
2.outputDirectory
表示jar文件的输出目录,默认值是:${project.build.directory},就是target目录,生成的jar文件就输出到这里。
3.excludes
表示jar文件打包时,需要排除哪些文件,比如我们在开发时有个dev.properties文件,打包时我们就不需要了,可以这样配置:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.4</version> <configuration> <excludes> <exclude>conf/**</exclude> <exclude>bin/**</exclude> <exclude>cache/**</exclude> <exclude>attachment/**</exclude> <exclude>dev.properties</exclude> </excludes> </configuration> </plugin>
这里我们排除了部分文件夹和开发时用到的文件,在打包时不加入到jar文件中。
4.includes
这个与excludes相反,就是把需要的文件在打包时加入到jar文件中,具体配置可以参照excludes的配置。
5.archive
这个属性配置很多,主要是用于定制化我们的jar包结构以及对Manifest文件的定制化。下面我们用几个实例来演示。
添加Implementation和Specification属性
默认情况下面Manifest文件结构如下:
Manifest-Version: 1.0 Created-By: Apache Maven ${maven.version} Build-Jdk: ${java.version}
我们可配置下面属性:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.4</version> <configuration> <archive> <manifest> <addDefaultImplementationEntries>true</addDefaultImplementationEntries> <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries> </manifest> </archive> </configuration> </plugin>
这样生成的Manifest如下:
Manifest-Version: 1.0 Created-By: Apache Maven ${maven.version} Build-Jdk: ${java.version} Specification-Title: ${project.name} Specification-Version: ${project.artifact.selectedVersion.majorVersion}.${project.artifact.selectedVersion.minorVersion} Specification-Vendor: ${project.organization.name} Implementation-Title: ${project.name} Implementation-Version: ${project.version} Implementation-Vendor: ${project.organization.name}
添加manifestEntries
这个属性可以添加一下项目信息到jar文件中。常用配置如下:
<configuration> <archive> <manifestEntries> <mode>prod</mode> <url>${project.url}</url> </manifestEntries> </archive> </configuration>
生成的Manifest如下:
Manifest-Version: 1.0 Created-By: Apache Maven ${maven.version} Build-Jdk: ${java.version} mode: prod url: http://project.url.com
添加键值对属性Manifest Sections
这个功能可以添加多个键值属性,配置如下:
<archive> <manifestSections> <manifestSection> <name>value1</name> <manifestEntries> <id>key1</id> </manifestEntries> </manifestSection> <manifestSection> <name>value2</name> <manifestEntries> <id>key2</id> </manifestEntries> </manifestSection> </manifestSections> </archive>
结果如下:
Manifest-Version: 1.0
Created-By: Apache Maven ${maven.version}
Build-Jdk: ${java.version}
Name: value1
id: key1
Name: value2
id: key2
自定义manifest配置
可以根据下面的配置来定制化manifest文件的加载机制:
设置一个可执行的jar文件
我们可以发布一个可执行的jar文件,就是可以通过命令行来启动一个jar。也可以把一个jar文件当做依赖库,提供给其他项目来使用。如果要发布一个可执行的jar,配置如下:
<configuration> <archive> <manifest> <mainClass>com.test.Main</mainClass> </manifest> </archive> </configuration>
这里com.test.Main必须要有一个main方法
精确设置Classpath
就是将所有的jar文件全部枚举出来,配置如下:
<project> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> </manifest> </archive> </configuration> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.1</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.11.0</version> </dependency> </dependencies> </project>
Manifest生成结果如下:
Manifest-Version: 1.0
Created-By: Apache Maven ${maven.version}
Build-Jdk: ${java.version}
Class-Path: commons-io-2.11.0.jar commons-lang-2.1.jar
注意这样运行这个jar文件时,需要保证Class-Path的依赖jar在目录中保持平级。
根据目录设置classpath
这里需要用到属性classpathPrefix,配置如下:
<configuration> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> </manifest> </archive> </configuration>
Manifest生成结果如下:
Class-Path: lib/commons-io-2.11.0.jar lib/commons-lang-2.1.jar
注意这样运行这个jar文件时,需要保证lib目录和执行jar保持平级。
配置classpath的加载样式
加载样式意思是可以通过特定的配置来配置classpath的路径,配置属性是:classpathLayoutType
自定义加载样式classpathLayoutType=custom
配置如下:
<configuration> <archive> <manifest> <addClasspath>true</addClasspath> <classpathLayoutType>custom</classpathLayoutType> <customClasspathLayout>lib/$${artifact.groupIdPath}/$${artifact.artifactId}-$${artifact.version}$${dashClassifier?}.$${artifact.extension}</customClasspathLayout> </manifest> </archive> </configuration>
接入如下:
Class-Path: lib/commons-io/commons-io-2.11.0.jar lib/commons-lang/commons-lang-2.1.jar
maven风格加载样式classpathLayoutType=repository
我们也可以设置maven风格的加载样式,如果目标机器上有maven库,我们可以这样设置:
<configuration> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>${user.home}/.m2/repository</classpathPrefix> <classpathLayoutType>repository</classpathLayoutType> </manifest> </archive> </configuration>
结果如下:
Class-Path: ${user.home}/.m2/repository/commons-io/commons-io-2.11.0.jar ${user.home}/.m2/repository/commons-lang/commons-lang/2.1/commons-lang-2.1.jar
这里的${user.home}会替换成你电脑上的绝对路径
强制使用SNAPSHOT版本的依赖
有时我们依赖的jar包可能是SNAPSHOT版本的,默认情况SNAPSHOT版本的库文件是不会被加载的,这里可以使用useUniqueVersions来启用,配置如下:
<configuration> <archive> <manifest> <useUniqueVersions>false</useUniqueVersions> </manifest> </archive> </configuration>
这样SNAPSHOT版本的jar依赖也会被加载。
加载外部的manifest文件
我们也可以将manifest编写好,然后直接使用我们自己编写的文件,配置如下:
<configuration> <archive> <manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile> </archive> </configuration>
这里就直接加载我们自己编写的MANIFEST文件。
总结
与maven-jar-plugin相同的还有一个maven-war-plugin插件,用于将我们的程序打包成war格式的执行包,也是maven默认的打包工具。这个主要用于web项目。它的用法和maven-jar-plugin完全一样,大家可以参照上面的使用。
到此这篇关于maven插件maven-jar-plugin构建jar文件的详细使用的文章就介绍到这了,更多相关maven-jar-plugin构建jar文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!