如何用Gradle Kotlin脚本构建包含依赖源码的胖源码Jar包?
构建包含所有依赖源码的胖源码Jar包(Kotlin DSL)
一、实现胖源码Jar构建
你可以通过自定义Gradle任务,结合源码依赖配置,实现包含自身及所有依赖源码的「胖源码Jar」。以下是完整实现步骤:
1. 定义源码依赖配置
首先创建一个自定义配置,专门管理所有源码相关的依赖:
// 自定义配置,用于统一管理源码依赖(项目内模块、本地库源码) val sourceDependencies by configurations.creating { isCanBeResolved = true isCanBeConsumed = false }
2. 声明源码依赖
在dependencies块中,像声明主依赖一样声明对应源码:
dependencies { // 主业务依赖(原有的实现依赖) implementation(project(":common")) implementation(files("../libs/somejar1.jar")) implementation(files("../libs/somejar2.jar")) // 对应源码依赖 // 项目内模块:依赖其源码Jar任务产物(需确保该模块已配置sourcesJar) sourceDependencies(project(":common", "sourcesJar")) // 本地第三方库:直接指定源码Jar文件 sourceDependencies(files("../libs/somejar1-sources.jar")) // 本地第三方库:若源码是目录形式,直接指定目录路径 sourceDependencies(files("../libs/somejar2-sources")) }
注:如果项目内模块未配置
sourcesJar任务,可直接依赖其源码目录:sourceDependencies(project(":common")) { artifact { type = "source" from(project(":common").sourceSets.main.get().allSource) } }
3. 创建胖源码Jar任务
注册一个自定义Jar任务,收集所有源码并打包:
tasks.register<Jar>("fatSourcesJar") { // 设置Jar包后缀为sources,方便区分 archiveClassifier.set("sources") // 排除重复的源码文件 duplicatesStrategy = DuplicatesStrategy.EXCLUDE // 1. 添加当前模块自身的源码 from(sourceSets.main.get().allSource) // 2. 添加项目内依赖模块的源码(可选,若已通过sourceDependencies依赖则可省略) configurations.implementation.get().dependencies .filterIsInstance<ProjectDependency>() .forEach { dep -> from(dep.dependencyProject.sourceSets.main.get().allSource) } // 3. 添加本地第三方库的源码(通过自定义配置获取) from(sourceDependencies.map { if (it.isDirectory) it else zipTree(it) }) }
执行./gradlew fatSourcesJar即可生成目标胖源码Jar包,默认输出路径为build/libs/[模块名]-sources.jar。
二、类似依赖声明的源码管理方案
Gradle没有原生的sources块,但通过上面的自定义配置sourceDependencies,你可以完全实现「像声明依赖一样声明源码」的需求:
- 统一在
dependencies块中维护主依赖与对应源码依赖的关联 - 支持项目内模块、本地Jar/目录等多种源码来源
- 遵循Gradle的依赖解析逻辑,自动处理任务依赖(比如项目模块的源码Jar会自动先构建再打包)
内容的提问来源于stack exchange,提问作者Dahl
相关产品推荐
相关产品推荐

