使用Gradle bootJar替代jar任务后Jenkins构建失败
看起来你遇到的核心问题是:Jenkins的artifactoryPublish任务还在试图寻找旧的jar任务产出的文件,而没有适配Spring Boot插件替换后的bootJar任务,另外也有可能是Jenkins环境中的配置覆盖了你在bootJar里定义的baseName。下面分几个方向给你排查和解决的思路:
1. 确保Artifactory发布任务关联bootJar产物
Spring Boot Gradle插件会自动禁用默认的jar任务,并用bootJar替代。如果你的Artifactory配置还是默认绑定jar任务的产物,就会找不到文件。你需要明确告诉Gradle的发布系统要使用bootJar的输出:
在build.gradle里配置publishing块,将bootJar关联到Maven发布组件:
publishing { publications { mavenJava(MavenPublication) { artifact bootJar // 这里指定用bootJar的产物,而不是默认的jar } } } // 然后确保artifactoryPublish任务使用这个发布配置 artifactoryPublish { publications('mavenJava') }
这样Artifactory插件就会去上传bootJar生成的my-project-0.2.1-SNAPSHOT.jar,而不是找旧的jar文件。
2. 检查Jenkins是否覆盖了Gradle的baseName或项目名称
有时候Jenkins构建会通过命令行参数覆盖Gradle的属性,比如有些团队会在Jenkins构建配置里加-Pproject.name=workspace或者类似参数,这会直接覆盖你在bootJar里设置的baseName(如果你的配置里有依赖project.name的逻辑)。
你可以在build.gradle里加一行日志,验证Jenkins环境中的baseName和项目名称:
bootJar { baseName = 'my-project' println ">>> BootJar baseName in build: ${baseName}" println ">>> Project name in build: ${project.name}" // 其他原有配置... }
然后查看Jenkins的构建日志,看这两个输出是不是my-project。如果不是,说明Jenkins的构建参数或环境变量覆盖了你的配置,需要去Jenkins的任务配置里删掉这些额外参数。
3. 排查是否有其他脚本/插件修改了归档名称
检查你的build.gradle或者引入的其他Gradle插件(比如自定义的发布脚本、版本管理插件),有没有动态修改bootJar或jar的archiveName、baseName的逻辑。比如有些插件会根据分支名称自动修改版本或文件名,这可能导致Jenkins环境下的文件名和本地不一致。
4. 强制指定Artifactory的上传文件路径
如果前面的方法都没解决,你可以直接在artifactoryPublish任务里硬指定要上传的文件,绕过自动匹配的逻辑:
artifactoryPublish { deploy { // 直接指定bootJar生成的文件路径 artifact(file("${buildDir}/libs/my-project-${project.version}-SNAPSHOT.jar")) { targetPath = "com/example/my-project/${project.version}/" // 对应你的Artifactory仓库路径 } } }
为什么本地正常?
本地构建时,没有Jenkins环境的额外参数干扰,bootJar任务的配置能正常生效,生成正确的文件名;而Jenkins环境要么是Artifactory插件没适配新的bootJar任务,要么是有外部参数覆盖了你的配置,导致任务找错了文件。
内容的提问来源于stack exchange,提问作者Simo

