maven工程打包老是报错_Maven将工程打包成Jar的问题总结

在尝试使用`mvn package`命令打包Maven工程时遇到缺少主清单属性的错误。经过尝试,发现在`maven-jar-plugin`配置主类后,仍然出现`NoClassDefFoundError`。最后通过使用`maven-shade-plugin`成功打包,并解释了三个插件的不同应用场景:`maven-jar-plugin`适用于第三方库,`maven-shade-plugin`适用于直接运行的程序,包含所有依赖,`maven-assembly-plugin`则用于复杂打包需求,如包含依赖和脚本。
摘要由CSDN通过智能技术生成

背景

直接用 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

如果有更复杂的打包需求,不仅需要项目的字节码,还得包含依赖以及相关脚本文件一方便客户解压后就能运行。这时候就可以使用此插件自定义包的格式。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值