Чтение 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() }
.
Ответ 3
Я использовал maven-publish, maven-publish-auth плагины, чтобы выполнить это без разбора настроек вручную
Как Gradle Использовать настройки репозитория из Maven Settings.xml для публикации артефактов
Надеюсь, что это полезно.
Петр
Ответ 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()")
...