使用Gradle MavenPublish发布Spring Boot Jar时遇版本依赖错误求助
你碰到的这个generateMetadataFileForMavenJavaPublication失败问题,根源在于Spring Boot的dependency-management插件帮你统一管理了所有依赖的版本,但默认的maven-publish插件在生成Maven元数据时,没法自动获取这些已经被解析好的依赖版本,导致元数据里的依赖项都没有版本号,不符合Maven仓库的规范要求。
下面给你几个实用的解决办法:
方法一:让发布任务使用已解析的依赖版本
修改你的publishing配置块,添加版本映射规则,让Gradle把dependency-management锁定的版本写入元数据:
publishing { publications { mavenJava(MavenPublication){ components.java // 添加版本映射,使用已解析的依赖版本 versionMapping { usage('java-api') { fromResolutionOf('runtimeClasspath') } usage('java-runtime') { fromResolutionResult() } } } } }
这个配置会告诉Gradle,在生成Maven元数据时,直接使用项目构建过程中已经解析好的依赖版本,完美适配Spring Boot的依赖管理机制。
方法二:改用Spring Boot官方的发布插件
Spring Boot专门提供了适配自身的Maven发布插件,能自动处理这类元数据问题,配置起来更省心。你可以修改plugins块,替换原生的maven-publish:
plugins { id 'org.springframework.boot' version '2.2.6.RELEASE' id 'io.spring.dependency-management' version '1.0.9.RELEASE' id 'java' // 添加Spring Boot的Maven发布插件 id 'org.springframework.boot.maven' version '2.2.6.RELEASE' }
之后直接执行./gradlew bootPublishMaven就能完成发布,不需要额外配置元数据相关的内容。
方法三:手动在POM中引用Spring Boot BOM(进阶场景)
如果你的项目有特殊的依赖管理需求,也可以在发布的POM中手动引用Spring Boot的BOM,让Maven客户端能通过BOM获取依赖版本:
publishing { publications { mavenJava(MavenPublication){ components.java pom { dependencyManagement { dependencies { dependency 'org.springframework.boot:spring-boot-dependencies:2.2.6.RELEASE' } } } } } }
不过对于普通的Spring Boot项目,前两种方法已经足够简单好用了,这个方法更适合复杂的多模块或自定义依赖场景。
另外补充一点:你日志里看到application-jar:jar被SKIPPED,是因为Spring Boot默认生成的是可执行jar,而components.java默认关联的是普通jar。如果需要发布Spring Boot的可执行jar,可以把publication配置改成:
mavenJava(MavenPublication){ artifact bootJar }
这样发布的就是Spring Boot打包好的可执行jar包了。
内容的提问来源于stack exchange,提问作者Nakamura

