Gradle默认jar包名为projectName-version.jar,需通过配置jar任务的archiveBaseName和archiveVersion属性修改;Gradle 6.0+须用set()方法,Kotlin DSL同理;还可通过exclude、from等控制内容,并用tasks.register定义多用途jar任务。

Gradle 默认生成的 jar 包名是 projectName-version.jar,比如 myapp-1.0.jar。如果你不想带版本号、不想用项目名、或者要区分环境(如 myapp-prod.jar),就得主动干预 jar 任务的 archiveBaseName 和 archiveVersion 属性——不是改文件名,而是改构建逻辑本身。
修改 jar 任务的 archiveBaseName
这是最直接的方式,适用于只想改名字、不改其他行为的场景。Java 插件默认注册了一个叫 jar 的 Task,类型为 Jar,它支持通过属性控制输出名。
-
archiveBaseName控制主文件名(不含扩展名和版本) -
archiveVersion控制版本部分(设为空字符串可去掉-1.0) - 必须在
build.gradle中对jar任务做配置,不能只写在tasks.register里
示例:
jar {
archiveBaseName.set("mytool")
archiveVersion.set("")
}
执行 gradle jar 后,输出就是 build/libs/mytool.jar,而不是 mytool-1.0.jar。
立即学习“Java免费学习笔记(深入)”;
为什么 baseName 不生效?检查 Gradle 版本和 DSL 写法
Gradle 6.0+ 强制使用 archiveBaseName.set(...) 这种函数式写法;旧版(如 4.x)允许直接赋值 baseName = "xxx",但新版会报错 Could not set unknown property 'baseName' for task ':jar' of type org.gradle.api.tasks.bundling.Jar。
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
- Gradle 6.0+ 必须用
archiveBaseName.set("xxx")或archiveBaseName.convention("xxx") - Gradle 7.0+ 还支持
archiveFileName直接设完整文件名,例如archiveFileName.set("mytool.jar") - 如果用了 Kotlin DSL(
build.gradle.kts),写法是archiveBaseName.set("mytool"),不是archiveBaseName = "mytool"
打包时要排除测试类或资源?别只改名字,顺手清理内容
光改名字容易忽略实际 jar 包内容是否干净。比如 src/test/** 下的类意外打进去了,或者 logback-test.xml 覆盖了生产配置。
- 默认
jar任务只包含src/main/**编译结果和资源,但若项目里手动加了from,就可能混入不该有的东西 - 用
exclude显式过滤更可靠:exclude '**/Test.class', '**/test/**' - 资源文件路径要注意:
src/main/resources自动包含,但src/main/config不会——得手动from("src/main/config")
完整可控示例:
jar {
archiveBaseName.set("mytool")
archiveVersion.set("")
exclude '**/Test.class'
exclude '**/integration/**'
from('src/main/config') {
into('config')
}
}
需要多个不同命名的 jar?用 tasks.register 定义新任务
比如既要 mytool-cli.jar(含 main class),又要 mytool-core.jar(纯 API,无启动类),就不能只改默认 jar 任务——得注册新任务,避免互相干扰。
- 新任务类型也用
Jar,但需显式指定from源,否则内容为空 - 依赖关系要手动声明:
dependsOn("classes"),否则编译还没完成就打包 - 避免和默认
jar冲突:不要重名,也不要覆盖archiveFileName到同一路径
示例:
tasks.register<Jar>("cliJar") {
archiveBaseName.set("mytool-cli")
archiveVersion.set("")
from(sourceSets["main"].output)
manifest {
attributes("Main-Class" to "com.example.CliApp")
}
dependsOn("classes")
}
执行 gradle cliJar 即可生成独立 jar。
真正麻烦的不是改名字,而是改完之后发现 MANIFEST.MF 里没 Main-Class、资源没进去、或者依赖包被漏掉——名字只是表象,内容才是运行时的关键。

















