1. maven-assembly-plugin
参考maven-assembly-plugin, maven-assembly-plugin这个插件可用来打可发布可独立运行的jar包, 也就是说它可以将项目中所有依赖打进包。
使用插件
在pom中加入:
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<!--这个插件会输出多个包,原始包不包含任何依赖,
以及一个或者多个包含所有依赖的包,这些包以<descriptorRef>中的value为后缀。 这里可以配置n个<descriptorRef>,就会多生成n个包含所有依赖的包-->
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<!--这里将single这个goal绑定在package这个phase上-->
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
<!--<configuration>-->
<!--<archive>-->
<!--<manifest>-->
<!--<mainClass>me.test.sparktest.WordCount</mainClass>-->
<!--</manifest>-->
<!--</archive>-->
<!--</configuration>-->
</execution>
</executions>
</plugin>
</plugins>
使用命令:
mvn assembly:single
** 生成可运行的包**
去掉上面配置中<configuration></configuration>的注释,<mainClass>这个元素指定了MANIFEST.MF中的Main-Class。
2. maven-shade-plugin
这个插件功能介绍如下:
This plugin provides the capability to package the artifact in an uber-jar.
关于什么是uber-jar可以参考stackoverflow上的回答what-is-an-uber-jar
和assembly插件一样它也可以将所有依赖打到包中,同时也可以打可执行的jar包。
参考官方文档:maven-shade-plugin
1. 使用插件
在pom中加入配置:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<!-- put your configurations here -->
</configuration>
<executions>
<execution>
<!--将shade 这个goal绑定到package这个phase上-->
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
</plugin>
运行命令mvn package
(将shade绑定在package这个phase上,不然会出错)
2. 可执行jar包
加入如下配置:
<plugin>
...
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<!--指定main所在的class-->
<mainClass>me.test.sparktest.WordCount</mainClass>
</transformer>
</transformers>
</configuration>
...
</pluigin>
3. 改变MANIFEST.MF
依然是2中的配置, 如下:
<plugin>
...
<executions>
...
<execution>
...
<configuration>
<transformers>
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<manifestEntries>
<!--按照key: value 的形式在MANIFEST.MF中加入配置-->
<Main-Class>me.test.sparktest.WordCount</Main-Class>
<JdkSourceVersion>1.7</JdkSourceVersion>
</manifestEntries>
</transformer>
</transformers>
</configuration>
...
</execution>
...
</executions>
加入:<Main-Class>me.test.sparktest.WordCount</Main-Class>
会在MANIFEST.MF中加入Main-Class: me.test.sparktest.WordCount这样的信息
加入:<JdkSourceVersion>1.7</JdkSourceVersion>
会在生成的MANIFEST.MF中加入JdkSourceVersion: 1.7这样一行。
参考setting manifest entry
4. 合并资源文件
当项目中有很多同名的资源文件是,默认的行为是覆盖,比如spring项目的很多模块里都有META-INF/spring.handlers
这个文件(spring依靠这些文件去解析spring xml文件里面的元素), 如果采用默认的覆盖行为显然会导致错误,加入如下配置:
<plugin>
...
<executions>
<execution>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<!--AppendingTransformer会将相同的资源文件合并成一个,这里将META-INF/spring.handlers合并成一个-->
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.handlers</resource>
</transformer>
<transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>META-INF/spring.schemas</resource>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>