Gradle将构件部署到本地目录内的Maven仓库

7
Gradle的替代Maven的是什么?
<distributionManagement>
    <repository>
        <id>internal.repo</id>
        <name>Temporary Staging Repository</name>
        <url>file://${project.build.directory}/mvn-repo</url>
    </repository>
</distributionManagement>

<build>
 <plugins>
    <plugin>
        <artifactId>maven-deploy-plugin</artifactId>
        <version>2.8.1</version>
        <configuration>
               <altDeploymentRepository>internal.repo::default::file://${project.build.directory}/mvn-repo</altDeploymentRepository>
        </configuration>
    </plugin>
 </plugins>
</build>

我已经尝试过:

apply plugin: 'maven'

uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: "file:///tmp/mvn-repo")
        }
    }
}

但它会抛出以下错误:
[ant:null] Error reading settings file '/private/var/folders/KH/KH+cubLjEESWzOTqVrx-bU+++TI/-Tmp-/gradle_empty_settings7564764539012703872.xml' - ignoring. Error was: /private/var/folders/KH/KH+cubLjEESWzOTqVrx-bU+++TI/-Tmp-/gradle_empty_settings7564764539012703872.xml (No such file or directory)

我正在处理的项目是 git://github.com/SpringSource/spring-data-rest.git 的分支 1.0.0.RELEASE,这是项目的 build.gradle 文件
Gradle 完整输出如下:
gradle uploadArchives
The groovy configuration has been deprecated and is scheduled to be removed in Gradle 2.0. Typically, usages of 'groovy' can simply be replaced with 'compile'. In some cases, it may be necessary to additionally configure the 'groovyClasspath' property of GroovyCompile and Groovydoc tasks.
:uploadArchives
[ant:null] Error reading settings file '/private/var/folders/KH/KH+cubLjEESWzOTqVrx-bU+++TI/-Tmp-/gradle_empty_settings396071803108301794.xml' - ignoring. Error was: /private/var/folders/KH/KH+cubLjEESWzOTqVrx-bU+++TI/-Tmp-/gradle_empty_settings396071803108301794.xml (No such file or directory)
:spring-data-rest-core:compileJava UP-TO-DATE
:spring-data-rest-core:compileGroovy UP-TO-DATE
:spring-data-rest-core:processResources UP-TO-DATE
:spring-data-rest-core:classes UP-TO-DATE
:spring-data-rest-core:jar UP-TO-DATE
:spring-data-rest-core:javadoc UP-TO-DATE
:spring-data-rest-core:javadocJar UP-TO-DATE
:spring-data-rest-core:sourcesJar UP-TO-DATE
:spring-data-rest-core:uploadArchives
:spring-data-rest-repository:compileJava UP-TO-DATE
:spring-data-rest-repository:compileGroovy UP-TO-DATE
:spring-data-rest-repository:processResources UP-TO-DATE
:spring-data-rest-repository:classes UP-TO-DATE
:spring-data-rest-repository:jar UP-TO-DATE
:spring-data-rest-repository:javadoc UP-TO-DATE
:spring-data-rest-repository:javadocJar UP-TO-DATE
:spring-data-rest-repository:sourcesJar UP-TO-DATE
:spring-data-rest-repository:uploadArchives
:spring-data-rest-webmvc:compileJava UP-TO-DATE
:spring-data-rest-webmvc:compileGroovy UP-TO-DATE
:spring-data-rest-webmvc:processResources UP-TO-DATE
:spring-data-rest-webmvc:classes UP-TO-DATE
:spring-data-rest-webmvc:jar UP-TO-DATE
:spring-data-rest-webmvc:javadoc UP-TO-DATE
:spring-data-rest-webmvc:javadocJar UP-TO-DATE
:spring-data-rest-webmvc:sourcesJar UP-TO-DATE
:spring-data-rest-webmvc:uploadArchives

我使用Gradle 1.12。

本地文件的URL以 file:/// 开头(即三个斜杠)。 - Peter Niederwieser
Peter,发现得好,谢谢,不幸的是它没有解决问题。我已经更新了问题并提供了更多细节。 - Adam Siemion
uploadArchives 任务在哪里? - Opal
不确定错误来自哪里。通常,发布到文件URL都可以正常工作。 - Peter Niederwieser
感谢Peter和Opal的帮助,我已经找到了问题的原因并将其放入我的答案中。 - Adam Siemion
4个回答

5
我找到了问题的原因。我正在构建一个多模块项目,这里我发现了以下信息:

52.6.4.1. 项目中有多个工件

Maven只能处理每个项目中的一个工件。这反映在Maven POM的结构中。我们认为有很多情况下,一个项目中有多个工件是有意义的。在这种情况下,您需要生成多个POM。在这种情况下,您必须明确声明要发布到Maven仓库的每个工件。

所以,我将uploadArchives从根级build.gradle移动到项目级build.gradle,这解决了问题。
我认为关于maven's setting.xml的错误消息非常具有误导性,应该由Gradle团队修复。

我在项目级别的build.gradle文件中有它。出现了相同的错误。不确定发生了什么。更好的错误信息可能会有很大帮助。 - lostintranslation

5

如果您想进行本地部署(例如到~/.m2),则需要:

apply plugin: 'maven'

uploadArchives {
    repositories {
        mavenDeployer {
            mavenLocal()
        }
    }
}

我没有尝试在默认设置以外的地方使用存储库,但我认为您可以在 ~/.m2/settings.xml 中设置存储库位置:

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
  http://maven.apache.org/xsd/settings-1.0.0.xsd">
  <localRepository>/tmp/mvn_repo</localRepository>
  ...
</settings>

或者你可以在gradle构建文件中设置URL:
maven {
     url uri('/tmp/mvn_repo')
} 

谢谢Mikea,我已经找到了问题的原因并将其放在了我的答案中。 - Adam Siemion

3
如果您想要本地部署(例如到~/.m2/repository),那么: 1. Gradle中的mavenLocal()方法会检查settings.xml中的localRepository,如果不存在,则会使用默认值。
<localRepository>${user.home}/.m2/repository</localRepository>

2. 在 build.gradle 文件中添加以下内容

apply plugin: 'maven'

uploadArchives {
      repositories {
          mavenDeployer {
                         repository(url: mavenLocal().url)
                        } 
                   }
            }

2

当你过滤要发布的构件时,比如使用以下过滤器上传war文件到uploadArchives,其他所有构件如war和zip都会显示出错:

这个错误也会在这种情况下发生。

uploadArchives {

    repositories.mavenDeployer {            

        addFilter('war') {artifact, file ->
            artifact.ext == 'war'
        }

    }
}

您需要显式地为每个需要发布的构件添加过滤器:

        addFilter('jar') {artifact, file ->
            artifact.ext == 'jar'
        }

        addFilter('zip') {artifact, file ->
            artifact.ext == 'zip'
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接