使用 Gradle 和 Spring Boot 时无法发布到本地 maven 存储库
Posted
技术标签:
【中文标题】使用 Gradle 和 Spring Boot 时无法发布到本地 maven 存储库【英文标题】:Unable to publish to local maven repo when using Gradle and Spring Boot 【发布时间】:2014-07-03 04:14:45 【问题描述】:我有一个非常简单的 spring-boot (1.0.2) 示例(基于http://spring.io/guides/gs/rest-service/)使用 Gradle (1.12) 创建一个 jar 文件。
我正在尝试使用 maven 或 maven-publish gradle 插件构建并发布到我的本地 maven 存储库,但出现错误:
无法初始化 POM pom-default.xml:无法在 /Users/jcc/Documents/stash/hello-springboot/build/poms/pom-default.xml 验证项目 ngdc.sample:hello-springboot 的 POM
不明白为什么。 version、group 和 archivesBaseName 都在 build.gradle 中指定。一个不依赖 SpringBoot 的类似项目可以正常工作。
有人可以提出问题可能是什么吗?
谢谢!
--约翰
【问题讨论】:
artifactory
插件需要maven
插件,而artifactory-publish
需要maven-publish
插件,从您的问题来看,spring-boot
插件与它们冲突。因此,您可能需要从弄清楚这一点开始。重新表述问题或询问有关将 maven 插件添加到 spring-boot probject 的其他问题可能是一个好主意。
【参考方案1】:
您可能需要确保还指定了父 pom 或依赖项管理(取决于您的配置,但如果您使用的是 Spring Boot Gradle 插件,您可能确实需要它)。此处示例:https://github.com/spring-projects/spring-boot/blob/master/spring-boot-integration-tests/spring-boot-gradle-tests/src/test/resources/installer.gradle
install
repositories.mavenInstaller
pom.project
parent
groupId 'org.springframework.boot'
artifactId 'spring-boot-starter-parent'
version "$project.bootVersion"
【讨论】:
我遇到了同样的问题,这解决了它。不过,我不得不对 $project.bootVersion 进行硬编码。 我们为什么需要这么奇怪的配置。我尝试将pom.project.parent
设置为我的项目,但失败了。所以我复制了你的解决方案,它成功了。
如果我们使用 maven-publish 插件我们应该改变什么?在这种情况下,上面的代码 sn-p 不起作用。
@ernesto.guevara 我使用 maven-publish 插件在这个问题上取得了进展,使用:publications mavenJar(MavenPublication) pom.withXml def parentNode = asNode().appendNode('parent') parentNode.appendNode('groupId','org.springframework.boot') parentNode.appendNode('artifactId','spring-boot-starter-parent') parentNode.appendNode('version',springBootVersion) from components.java
非常感谢这个解决方案,正是我正在寻找的东西。此外,我还使用install.depensOn build
扩展了构建脚本,以使发布的 jar 可以运行。【参考方案2】:
这告诉我您的工件(jar 或 war)正在创建,但随附的 pom 验证失败。对于有效的 Maven 工件,您需要 groupdId
、artifactId
和 version
....
转换为 gradle group
、archivesBaseName
和 version
。
确保你在你的工件上设置或配置了这三个属性,你可能会得到一些运气:-)
例如... archivesBaseName = 'xcxcxcxc' 组=“com.blah.xxdddd” 版本 = '#.#.#' ...
【讨论】:
【参考方案3】:当dependency...
部分的Spring Boot Gradle Plugin没有依赖版本时,会生成没有Spring Boot等版本的pom。
因此,目前需要为所有 maven realted 任务自己创建与父 pom 的关系
parent
groupId 'org.springframework.boot'
artifactId 'spring-boot-starter-parent'
version "$project.bootVersion"
见https://github.com/spring-projects/spring-boot/issues/1716
【讨论】:
【参考方案4】:我在这里遇到了同样的问题。谢谢@cjstehno,我会在这里总结我的构建文件。
1) 如果您使用的是 maven 插件,可以参考官方指南。
http://docs.spring.io/spring-boot/docs/current/reference/html/build-tool-plugins-gradle-plugin.html#build-tool-plugins-gradle-publishing-artifacts-to-a-maven-repository
2) 如果您使用的是 maven-publish 插件,您可以按照以下脚本进行操作。
另外,由于spring boot在发布前需要自己的打包过程(如bootRepackage和assemble),所以我把发布依赖于构建任务。
buildscript
dependencies
classpath 'org.springframework.boot:spring-boot-gradle-plugin:1.1.9.RELEASE'
apply plugin: 'spring-boot'
apply plugin: 'maven-publish'
group = '<some group id>'
version = '<some version with -SNAPSHOT>'
jar
baseName = '<jar base name>'
publish.dependsOn build
publishing
publications
mavenJar(MavenPublication)
pom.withXml
def parentNode = asNode().appendNode('parent')
parentNode.appendNode('groupId','org.springframework.boot')
parentNode.appendNode('artifactId','spring-boot-starter-parent')
parentNode.appendNode('version','1.1.9.RELEASE')
from components.java
publishing
repositories
maven
credentials
username 'admin'
password 'admin123'
url "http://<nexus server>:8081/nexus/content/repositories/snapshots/"
【讨论】:
以上是关于使用 Gradle 和 Spring Boot 时无法发布到本地 maven 存储库的主要内容,如果未能解决你的问题,请参考以下文章
使用 Spring Boot 时使用 JaCoCo 代码覆盖率构建 Gradle 多项目失败
使用胖 Jar 插件和 Spring Boot 应用程序构建的 Gradle 给出“应用程序启动失败”
使用 Gradle 在 Spring Boot 项目中从 Kotlin 测试中引用 Java 代码时未解决的引用
spring boot 使用 springloaded 在 gradle 中没有工作