背景
直接用 mvn package打包了,结果是报错,没有主清单属性,然后百度了一堆,发现都是用maven-shade-plugin这个插件,还有用maven-assembly-plugin,以及maven-jar-plugin。由于看着 maven-jar-plugin 插件的代码配置最短,我就用了。
org.apache.maven.plugins
maven-jar-plugin
定义主类的入口地址就是TestMain的全路径
com.spider.culture.main.Starter
结果也报错,NoclassDefFoundError org.apache.logging.log.LogManager。
显然是没把jar打包进去,折腾半天我就换了个配置。
org.apache.maven.plugins
maven-shade-plugin
1.2.1
package
shade
com.spider.culture.main.Starter
用这个打包就可以了。
分析
maven-jar-plugin
Maven打包jar用的默认插件是maven-jar-plugin,默认Maven生成的JAR包只包含了编译生成的.class文件和项目资源文件。
通过maven-jar-plugin插件打包的jar的目录结构(与以下插件生成的目录结构对比):
jar.png
要得到一个可以直接在命令行通过java命令运行的jar文件,还要满足两个条件:
jar包中的/META_INF/MANIFEST.MF元数据文件必须包含Main-Class信息;
项目所有的依赖都必须在Classpath中。
而maven-shade-plugin就可以实现这个功能。
maven-shade-maven
它可以让用户配置Main-class的值,然后在打包的时候将值填入/META-INF/MANIFEST.MF文件。关于项目的依赖,它聪明地将依赖jar文件全部解压后,再将得到的.class文件连同当前项目的.class文件一起合并到最终的CLI(Command Line)包中。
通过maven-shade-plugin插件打包的jar的目录结构:
image.png
所以我们可以直接使用java -jar命令运行程序。
maven-assembly-plugin
最强大的Maven打包插件。它支持各种打包格式,包括zip、tar.gz、tar.bz2等等,通过一个打包描述文件(assembly.xml),能够帮助用户选择具体的打包哪些文件集合、依赖、模块、和本地仓库文件,每个项的具体打包路径用户也能自由控制。
使用场景
通过以上描述,相信大家已经能明白各插件的使用场景。
maven-jar-plugin
用于第三方库。如果我们写的项目是用于为别人提供使用的时候,我们可以不需要打包依赖包。可以打开maven本地仓库看看各jar的打包格式,就是这种的。
maven-shade-plugin
用于需要运行的jar,如果是有主类,想直接在JRE上运行的程序,可以使用这种插件打包,它会把依赖库都打包进jar中。
maven-assembly-plugin
如果有更复杂的打包需求,不仅需要项目的字节码,还得包含依赖以及相关脚本文件一方便客户解压后就能运行。这时候就可以使用此插件自定义包的格式。