Чтение maven settings.xml при создании с помощью gradle?

У меня есть 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>

В этом репо я развернул артефакт - на самом деле его плагин 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.
...

Gradle не может найти my- gradle -plugin, хотя у меня есть указанный выше файл settings.xml, указывающий на удаленный репозиторий maven.

Если я вместо этого укажу репозиторий внутри моего файла 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 так, что не так?

Ответ 1

Существует открытый билет, связанный с этим, который, мы надеемся, будет реализован:

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

Но в качестве обходного пути вы можете использовать некоторые скрипты groovy в build.gradle для достижения этого. В моем случае мне нужна информация аутентификации из 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"])
    }


  }
}

Ответ 2

Вы должны объявить все репозитории в своей Gradle сборке script. settings.xml используется только для определения местоположения локального репозитория Maven, например, при разрешении repositories { mavenLocal() }.

Ответ 4

Смотрите: https://github.com/home1-oss/maven-settings-decoder

Я использую его в gradle build script, чтобы избежать появления пароля nexus в файле build.gradle или среды.

buildscript {
  repositories {
    ...
    maven { url 'https://raw.github.com/home1-oss/maven-settings-decoder/mvn-repo/' }
  }
  dependencies {
    ...
    classpath 'cn.home1.tools:maven-settings-decoder:1.0.0.OSS-SNAPSHOT'
  }
}
...
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()")
...