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

如何将多个JAR包合并为一个JAR包?目录结构见附图,不可直接解压合并

合并多JAR包的实用方案

直接解压合并行不通?试试这些专业工具和方法:

方案一:Maven Shade插件(Maven项目首选)

这是处理JAR合并最常用的工具,能自动解决重复类、签名冲突,还能配置可执行主类:

  1. 在项目的pom.xml里加这段插件配置:
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.5.1</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <!-- 配置可执行JAR的主类,替换成你的主类路径 -->
                        <transformers>
                            <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                <mainClass>com.yourpackage.YourMainClass</mainClass>
                            </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>
  1. 执行命令打包:
mvn clean package

打包完去target目录找带-shaded后缀的JAR,就是合并好的成品。

方案二:Gradle Shadow插件(Gradle项目用)

Gradle项目用Shadow插件同样省心:

  1. 在build.gradle中引入插件并配置:
plugins {
    id 'java'
    id 'com.github.johnrengelman.shadow' version '8.1.1'
}

// 配置主类和包重命名(解决类冲突)
shadowJar {
    manifest {
        attributes 'Main-Class': 'com.yourpackage.YourMainClass'
    }
    // 可选:把冲突的包重命名,比如把org.apache.commons改成自己项目的 shaded 目录下
    relocate 'org.apache.commons', 'com.yourproject.shaded.commons'
}
  1. 运行打包命令:
./gradlew shadowJar

build/libs目录下带-all后缀的JAR就是合并后的文件。

方案三:手动命令+脚本(无构建工具)

没在用Maven/Gradle?手动处理也行,就是要自己解决冲突:

  1. 建临时目录,把所有要合并的JAR都解压进去:
mkdir temp_unpack
for jar in *.jar; do unzip -o "$jar" -d temp_unpack; done
  1. 手动清理冲突文件(比如重复的类、签名文件),然后重新打包:
# 先自己写好MANIFEST.MF,指定主类和类路径
jar cvfm merged.jar MANIFEST.MF -C temp_unpack .

注意:这种方式必须手动删除META-INF下的.SF/.DSA/.RSA签名文件,不然合并后的JAR会验证失败;重复类也要自己取舍保留哪个版本。

核心注意点

  • 重复类:直接解压合并必出问题,构建工具的插件能通过包重命名、过滤解决。
  • 签名文件:JAR的签名文件会导致合并后的包无法正常运行,必须过滤或删除。
  • 可执行配置:如果要做可执行JAR,一定要在MANIFEST.MF里指定Main-Class属性。

内容的提问来源于stack exchange,提问作者ao guo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 16:33:29