如何将依赖源码添加至Gradle的sourceJar任务输出?
Gradle多模块构建:整合模块与本地依赖源码到Sources Jar
核心问题解决:提取本地源码Jar内容
你之前用from(file("../path/dependency-1.0.0-sources.jar"))会把整个Jar作为文件打包进sourcesJar,原因是没有对Jar文件进行解压。Gradle的zipTree()方法可以解压Zip/Jar文件,将其中的内容添加到输出Jar中,替换成以下写法即可:
tasks.sourcesJar { // 添加项目内moduleA的源码 from project(':moduleA').sourceSets.main.allSource // 解压并添加本地源码Jar的内容 from zipTree(file("../path/dependency-1.0.0-sources.jar")) }
如果有多个本地源码Jar,直接追加多个from zipTree(...)即可:
tasks.sourcesJar { from project(':moduleA').sourceSets.main.allSource from zipTree(file("../path/dep1-sources.jar")) from zipTree(file("../path/dep2-sources.jar")) // 更多本地源码Jar依次添加 }
完整配置示例(主模块build.gradle,Groovy语法)
假设你的主模块是moduleB,需要生成包含所有依赖编译代码的胖Jar和整合所有源码的sourcesJar,完整配置如下:
plugins { id 'java-library' } java { withSourcesJar() } // 生成包含所有依赖编译代码的胖Jar tasks.jar { // 如果需要主类可以取消注释 // manifest.attributes['Main-Class'] = 'com.example.MyMainClass' from configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } duplicatesStrategy = DuplicatesStrategy.EXCLUDE } // 整合项目模块与本地依赖源码到sourcesJar tasks.sourcesJar { // 添加项目内moduleA的源码 from project(':moduleA').sourceSets.main.allSource // 添加本地源码Jar的解压内容 from zipTree(file("../path/dependency-1.0.0-sources.jar")) // 若有多个本地源码Jar,继续添加 // from zipTree(file("../path/another-dep-sources.jar")) }
验证与构建
执行以下命令完成构建:
./gradlew :moduleB:build
构建完成后,在moduleB/build/libs/目录下会生成两个文件:
moduleB-0.5.0.jar:包含所有模块和依赖的编译代码(胖Jar)moduleB-0.5.0-sources.jar:包含moduleB自身源码、moduleA源码,以及所有本地依赖的源码
内容的提问来源于stack exchange,提问作者Dahl
相关产品推荐
相关产品推荐

