Gradle技术问询:如何生成包含project1及依赖project2的单一JAR包
生成包含project1和project2所有类的JAR文件方案
当然可以实现啦!针对你的Gradle项目结构(project1通过api project(':project2')依赖project2),有两种常用的方法来生成包含两个项目所有类的JAR文件,具体如下:
方法一:使用Shadow插件(推荐,简单高效)
Shadow插件是Gradle生态中专门用来构建包含所有依赖的“胖JAR”的工具,它会自动处理依赖传递,非常适合你的场景:
- 在project1的
build.gradle(或build.gradle.kts)中添加Shadow插件的依赖:
如果用Kotlin DSL:// Groovy DSL plugins { id 'java' id 'com.github.johnrengelman.shadow' version '7.1.2' // 可根据需要选择最新版本 }// Kotlin DSL plugins { java id("com.github.johnrengelman.shadow") version "7.1.2" } - 执行构建命令:
在终端运行./gradlew project1:shadowJar(Windows下用gradlew.bat project1:shadowJar) - 找到生成的JAR:
构建完成后,包含两个项目所有类的胖JAR会生成在project1/build/libs/目录下,文件名通常是project1-<你的版本号>-all.jar。
方法二:自定义Gradle Jar任务(无需插件)
如果你不想引入第三方插件,也可以手动创建一个自定义任务来打包两个项目的类:
在project1的build.gradle中添加以下任务配置:
task fatJar(type: Jar) { // 给生成的JAR添加后缀标识 archiveClassifier.set('fat') // 打包project1自身的编译产物 from sourceSets.main.output // 打包project2的编译产物 from project(':project2').sourceSets.main.output // 如果project2还有其他依赖需要一起打包,可以添加下面的配置(按需启用) // from configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } }
执行命令./gradlew project1:fatJar后,生成的胖JAR会在project1/build/libs/目录下,文件名格式为project1-<你的版本号>-fat.jar。
补充说明
因为你使用的是api依赖,project2的类会被标记为可传递的编译依赖,所以不管用哪种方法,都能确保project2的类被正确打包到最终的JAR中。如果后续项目有其他第三方依赖需要一并打包,Shadow插件会自动处理,自定义任务则需要额外配置来引入第三方依赖的编译产物。
内容的提问来源于stack exchange,提问作者Enuviel
相关产品推荐
相关产品推荐

