使用 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 工件,您需要 groupdIdartifactIdversion.... 转换为 gradle grouparchivesBaseNameversion。 确保你在你的工件上设置或配置了这三个属性,你可能会得到一些运气:-)

例如... 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 中没有工作

当我在开发模式下停止应用程序并将 build.gradle.kts 与 spring boot 一起使用时出错

Gradle测试任务,如何设置Spring Boot环境进行测试?