26

我有一个 Maven settings.xml 位于:

 /home/u123/.m2/settings.xml

我在其中指定一个远程 Maven 存储库:

<?xml version="1.0" encoding="UTF-8"?>
<settings>
  <profiles>
    <profile>
      <id>default</id>
      <repositories>
          <repository>
              <id>my.repo</id>
               <url>http://myrepo/ </url>
          </repository>
      </repositories>
    </profile>
  </profiles>
  <activeProfiles>
    <activeProfile>default</activeProfile>
  </activeProfiles>
</settings>

在这个 repo 中,我部署了一个工件 - 实际上它是一个 gradle 插件。

现在我尝试使用以下 build.gradle 文件构建另一个需要使用此插件/工件的项目:

apply plugin: 'java'
apply plugin: 'maven'

buildscript {
    dependencies {
        classpath 'com.test:my-gradle-plugin:1.0.0-SNAPSHOT'
    }
}

但构建失败:

...
> Could not find group:com.test, module:my-gradle-plugin, version:1.0.0-SNAPSHOT.
...

即使我有上面的 settings.xml 文件指向远程 maven 存储库,Gradle 也找不到 my-gradle-plugin。

如果我改为我的 build.gradle 文件中指定存储库,它可以工作:

buildscript {
    repositories {
        maven {
            url "http://myrepo/"
        }
    }
    dependencies {
        classpath 'com.test:my-gradle-plugin:1.0.0-SNAPSHOT'
    }
}

基于这篇文章:

http://forums.gradle.org/gradle/topics/have_mavenlocal_check_m2_home_conf_settings_xml

似乎 gradle 考虑了 settings.xml 文件,所以出了什么问题?

4

6 回答 6

26

有一张与此相关的公开票有望被实施:

http://issues.gradle.org/browse/GRADLE-2365

但作为一种解决方法,您可以在 build.gradle 中使用一些 groovy 脚本来实现这一点。在我的情况下,我需要来自 settings.xml 的身份验证信息。但这可以很容易地适应获取存储库信息。

例子:

def getMavenSettingsCredentials = {
    String userHome = System.getProperty( "user.home" );
    File mavenSettings = new File(userHome, ".m2/settings.xml")
    def xmlSlurper = new XmlSlurper()
    def output = xmlSlurper.parse(mavenSettings)
    return output."servers"."server"
}

def getCredentials = {
    def entries = getMavenSettingsCredentials()
    for (entry in entries) {
        if ( entry."id".text() == "my-server" ) {
            return [username: entry.username.text(), password: entry.password.text()]
    }
  }
}
uploadArchives {
def creds = getCredentials()
repositories.mavenDeployer {
    configuration = configurations.deployerJars
    repository(url: "http://my-release-repository/releases/") {
        authentication(userName: creds["username"], password: creds["password"])
    }
    snapshotRepository(url: "http://my-snapshot-repository/snapshots/") {
        authentication(userName: creds["username"], password: creds["password"])
    }


  }
}
于 2013-03-14T07:17:32.290 回答
9

gradle-maven-settings-plugin对我有用(至少在我的 Windows 环境中)

一个应该添加

buildscript {
    repositories {
        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }
}

plugins {
    id 'net.linguica.maven-settings' version '0.5'
}

build.gradle然后可以像这样添加存储库:

repositories {
    maven {
        name = 'myRepo' // should match <id>myRepo</id> of appropriate <server> in Maven's settings.xml
        url = 'https://intranet.foo.org/repo'
    }
}

它将使用myRepo来自 Maven 的凭据settings.xml来访问https://intranet.foo.org/repo存储库

于 2018-05-26T19:26:27.370 回答
7

您必须在 Gradle 构建脚本中声明所有存储库。settings.xml仅用于查找本地 Maven 存储库的位置,例如在解析repositories { mavenLocal() }.

于 2012-09-21T00:20:48.270 回答
4

我使用 maven-publish、maven-publish-auth 插件来完成此操作,而无需手动解析设置

Gradle 如何使用来自 Maven 的 Settings.xml 的存储库设置来发布工件

希望它是有用的。

彼得

于 2014-02-10T18:39:22.967 回答
3

见:https ://github.com/ci-and-cd/maven-settings-decoder

我在 gradle 构建脚本中使用它来避免在 build.gradle 或环境变量中暴露 nexus 密码。

buildscript {
  repositories {
    ...
    mavenCentral()
  }
  dependencies {
    ...
    classpath 'cn.home1.tools:maven-settings-decoder:1.0.5.OSS'
  }
}
...
ext.mavenSettings = new cn.home1.tools.maven.SettingsDecoder();
ext.nexusSnapshotsUser = mavenSettings.getText("//server[id='${nexus}-snapshots']/username/text()")
ext.nexusSnapshotsPass = mavenSettings.getText("//server[id='${nexus}-snapshots']/password/text()")
println "${nexus}-snapshots username: " + mavenSettings.getText("//server[id='${nexus}-snapshots']/username/text()")
println "${nexus}-snapshots password: " + mavenSettings.getText("//server[id='${nexus}-snapshots']/password/text()")
...
于 2016-12-28T07:40:37.587 回答
1

请在 build.gradle 文件的存储库部分中使用 mavenLocal()。这应该读取您主目录中的 ~/.m2/settings.xml 文件。

repositories {
    mavenCentral()
    mavenLocal()
}
于 2018-11-08T22:12:37.123 回答