You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:36:32