如何将多个JAR包合并为一个JAR包?目录结构见附图,不可直接解压合并
合并多JAR包的实用方案
直接解压合并行不通?试试这些专业工具和方法:
方案一:Maven Shade插件(Maven项目首选)
这是处理JAR合并最常用的工具,能自动解决重复类、签名冲突,还能配置可执行主类:
- 在项目的
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>
- 执行命令打包:
mvn clean package
打包完去target目录找带-shaded后缀的JAR,就是合并好的成品。
方案二:Gradle Shadow插件(Gradle项目用)
Gradle项目用Shadow插件同样省心:
- 在
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' }
- 运行打包命令:
./gradlew shadowJar
build/libs目录下带-all后缀的JAR就是合并后的文件。
方案三:手动命令+脚本(无构建工具)
没在用Maven/Gradle?手动处理也行,就是要自己解决冲突:
- 建临时目录,把所有要合并的JAR都解压进去:
mkdir temp_unpack for jar in *.jar; do unzip -o "$jar" -d temp_unpack; done
- 手动清理冲突文件(比如重复的类、签名文件),然后重新打包:
# 先自己写好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
相关产品推荐
相关产品推荐

