Gradle默认不生成sources.jar,需显式注册sourceJar任务并配置archiveClassifier='sources'、from sourceSets.main.allSource,再通过dependsOn或finalizedBy使其随jar任务自动执行。

gradle sourceJar 任务默认不启用
Java插件默认不会生成源码包(sources.jar),即使你运行了 gradle build 或 gradle jar,输出目录 build/libs/ 下也只会有主 .jar 和可能的 -javadoc.jar(如果启用了 Javadoc 插件),但不会有源码包。这是新手最常困惑的一点:明明代码都在 src/main/java,为什么没被打进去?
手动配置 sourceJar 任务(Groovy DSL)
在 build.gradle 中添加以下块即可启用源码打包:
plugins {
id 'java'
}
// 必须显式声明,否则不会参与 publish 或 assemble 流程
tasks.register('sourceJar', Jar) {
archiveClassifier = 'sources'
from sourceSets.main.allSource
}
注意几个关键点:
-
archiveClassifier = 'sources'是约定名称,决定了最终文件名形如myapp-1.0-sources.jar -
from sourceSets.main.allSource包含src/main/java和src/main/resources—— 但通常源码包只应含.java;如需严格只打包 Java 源文件,改用sourceSets.main.java - 该任务注册后仍需手动触发:
gradle sourceJar,或让它被其他任务依赖(见下一条)
让 sourceJar 自动随 jar 一起生成
如果你希望每次运行 gradle jar 或 gradle assemble 时都顺带产出 -sources.jar,需建立任务依赖:
tasks.named('jar') {
dependsOn tasks.named('sourceJar')
}
// 或更通用(兼容 Gradle 7.4+):
tasks.withType(Jar).configureEach {
if (archiveClassifier.orNull == '') {
finalizedBy tasks.named('sourceJar')
}
}
这样执行 gradle jar 后,build/libs/ 下就会同时出现 myapp-1.0.jar 和 myapp-1.0-sources.jar。
发布到 Maven 仓库时 sourceJar 会自动包含吗
不会自动包含,除非你明确配置 maven-publish 插件并附加 artifact:
plugins {
id 'maven-publish'
}
publishing {
publications {
mavenJava(MavenPublication) {
from components.java
artifact(tasks.named('sourceJar'))
}
}
}
这里容易踩坑的是:
- 漏写
artifact(...)行 → 发布时无源码包 - 用
artifact tasks.sourceJar(未加named)在较新 Gradle 版本中会报错:任务尚未创建 - 若项目用了
java-library插件而非java,components.java仍可用,但需确认sourceJar任务已正确定义
源码包本身不参与编译或运行,但它是 IDE 跳转、调试和文档生成的基础——尤其当你把 jar 推送到私有 Nexus 或 Maven Central 时,没带 -sources.jar 会让下游开发者无法查看原始逻辑,这点常被忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











