执行publishToMavenLocal后Maven本地仓库未生成目标jar包问题
问题原因
该问题是Spring Boot Gradle插件的默认行为导致的:
- Spring Boot 2.5及以上版本中,
org.springframework.boot插件会默认修改Jar任务的输出规则:不带后缀的custom-codegen-0.0.1-SNAPSHOT.jar默认是可执行Fat Jar(包含所有内置依赖,不能作为普通依赖被其他项目引用),适合作为依赖的普通Jar包会被自动加上-plain后缀命名,也就是你现在看到的custom-codegen-0.0.1-SNAPSHOT-plain.jar - 你当前的
maven-publish配置使用from components.java默认发布的是带-plain后缀的普通Jar,没有对命名做调整,所以不会生成你预期的无后缀Jar包。
解决方案
根据你的项目用途选择对应配置即可:
场景1:项目是公共依赖库,不需要打包为可执行Spring Boot应用
直接禁用BootJar任务,让默认Jar任务生成无后缀的普通依赖Jar即可,在build.gradle中添加如下配置:
// 禁用可执行BootJar任务 bootJar { enabled = false } // 配置普通Jar任务的命名,去掉-plain后缀 jar { enabled = true archiveClassifier = '' }
修改后重新执行publishToMavenLocal就能得到无后缀的custom-codegen-0.0.1-SNAPSHOT.jar,这个Jar可以直接作为依赖被其他项目引用。
场景2:项目既需要作为可执行Spring Boot应用运行,又需要发布可被依赖的普通Jar
不需要禁用BootJar,只需要调整发布配置,指定发布的Jar包规则即可,修改publishing配置段:
publishing { publications { mavenJava(MavenPublication) { // 明确指定发布普通Jar任务的输出 artifact jar from components.java versionMapping { usage('java-api') { fromResolutionOf('runtimeClasspath') } usage('java-runtime') { fromResolutionResult() } } } } repositories { maven { def releasesRepoUrl = "$buildDir/repos/releases" def snapshotsRepoUrl = "$buildDir/repos/snapshots" url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl } } }
修改后执行发布命令,会同时保留可执行的Fat Jar和无后缀的可依赖Jar。
注意:如果你的项目内有
@SpringBootApplication注解的启动类,作为依赖发布时建议将启动类放到独立的包路径下,避免被其他引用项目的组件扫描逻辑误加载导致报错。
内容的提问来源于stack exchange,提问作者xWAV92OdD445CbzcZAEyunk2M06fJi
相关产品推荐
相关产品推荐

