美文网首页
Maven将工程打包成Jar的问题总结

Maven将工程打包成Jar的问题总结

作者: smlrole | 来源:发表于2018-02-02 15:28 被阅读0次

背景

直接用 mvn package打包了,结果是报错,没有主清单属性,然后百度了一堆,发现都是用maven-shade-plugin这个插件,还有用maven-assembly-plugin,以及maven-jar-plugin。由于看着 maven-jar-plugin 插件的代码配置最短,我就用了。

          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifest>
                        定义主类的入口地址就是TestMain的全路径
                        <mainClass>com.spider.culture.main.Starter</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>

结果也报错,NoclassDefFoundError org.apache.logging.log.LogManager
显然是没把jar打包进去,折腾半天我就换了个配置。

          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>1.2.1</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                        <configuration>
                            <transformers>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>com.spider.culture.main.Starter</mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                </execution>
            </executions>
         </plugin>

用这个打包就可以了。

分析

问题:那么这三个插件参加分别有什么呢?
参考来源:http://www.infoq.com/cn/news/2011/06/xxb-maven-9-package

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

相关文章

网友评论

      本文标题:Maven将工程打包成Jar的问题总结

      本文链接:https://www.haomeiwen.com/subject/ybkezxtx.html