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

Gradle技术问询:如何生成包含project1及依赖project2的单一JAR包

生成包含project1和project2所有类的JAR文件方案

当然可以实现啦!针对你的Gradle项目结构(project1通过api project(':project2')依赖project2),有两种常用的方法来生成包含两个项目所有类的JAR文件,具体如下:

方法一:使用Shadow插件(推荐,简单高效)

Shadow插件是Gradle生态中专门用来构建包含所有依赖的“胖JAR”的工具,它会自动处理依赖传递,非常适合你的场景:

  1. 在project1的build.gradle(或build.gradle.kts)中添加Shadow插件的依赖:
    // Groovy DSL
    plugins {
        id 'java'
        id 'com.github.johnrengelman.shadow' version '7.1.2' // 可根据需要选择最新版本
    }
    
    如果用Kotlin DSL:
    // Kotlin DSL
    plugins {
        java
        id("com.github.johnrengelman.shadow") version "7.1.2"
    }
    
  2. 执行构建命令:
    在终端运行./gradlew project1:shadowJar(Windows下用gradlew.bat project1:shadowJar)
  3. 找到生成的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:37:28