2018年使用Maven将Java应用及依赖打包为可执行胖JAR的最佳实践
2018年用Maven打包Java可执行胖JAR的最佳实践
在2018年那会儿,要把Java应用连同所有依赖打包成能直接运行的胖JAR(只要机器装了JRE就能跑),主流的最佳实践其实是用几个成熟的Maven插件,比你提到的那个小众插件靠谱多了。下面给你详细说说最常用的两种方案:
一、Maven Shade Plugin(最主流的选择)
这是Apache官方维护的插件,稳定性拉满,处理依赖冲突、资源文件重复这些问题也很灵活,2018年几乎是Java开发者打包胖JAR的首选。
你只需要在pom.xml里加入以下配置:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.1</version> <!-- 2018年的稳定版本 --> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <!-- 指定主类,让JAR能直接运行 --> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.example.MyMainClass</mainClass> </transformer> <!-- 合并多个JAR里的同名资源文件(比如spring.handlers这类) --> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/spring.handlers</resource> </transformer> </transformers> <!-- 可选:排除不需要打包的依赖 --> <filters> <filter> <artifact>*:*</artifact> <excludes> <exclude>META-INF/*.SF</exclude> <exclude>META-INF/*.DSA</exclude> <exclude>META-INF/*.RSA</exclude> </excludes> </filter> </filters> </configuration> </execution> </executions> </plugin> </plugins> </build>
打包的时候直接跑mvn package,就能在target目录下得到一个带依赖的可执行JAR,运行用java -jar your-app-1.0-SNAPSHOT.jar就行。
二、Maven Assembly Plugin(更灵活的打包控制)
如果你的应用需要自定义打包结构——比如要额外包含配置文件、启动脚本,或者对依赖的存放位置有要求,那Assembly插件会更适合。它支持通过XML描述文件(descriptor)来精确控制打包内容。
基础配置示例:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>3.1.0</version> <!-- 2018年的稳定版本 --> <configuration> <descriptorRefs> <!-- 使用预定义的jar-with-dependencies模板,把依赖打包进JAR --> <descriptorRef>jar-with-dependencies</descriptorRef> </descriptorRefs> <archive> <manifest> <mainClass>com.example.MyMainClass</mainClass> </manifest> </archive> </configuration> <executions> <execution> <id>make-assembly</id> <phase>package</phase> <goals> <goal>single</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
要是需要更复杂的打包逻辑,你可以自己写一个assembly descriptor文件,指定要包含的文件、目录,甚至把依赖打包到单独的lib目录里,再生成启动脚本。
关于你提到的executable-packer-maven-plugin
这个插件在2018年属于比较小众的选择,社区活跃度很低,维护也不算频繁。当时很多开发者反馈它处理复杂依赖冲突的能力不如Shade,而且遇到问题很难找到解决方案,所以不太推荐用在生产环境的项目里。
内容的提问来源于stack exchange,提问作者cikavladimir
相关产品推荐
相关产品推荐

