2012-09-21 11 views
11

Tengo un experto settings.xml ubicado en:¿Lees una configuración de maven.xml cuando construyes con gradle?

/home/u123/.m2/settings.xml 

donde puedo especificar un repositorio Maven remoto:

<?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> 

En este repo He desplegado un artefacto - en realidad es un plug-in Gradle.

ahora trato de construir otro proyecto que tiene que utilizar este plugin/artefacto utilizando el archivo build.gradle a continuación:

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

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

Pero la generación falla:

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

Gradle no puede encontrar mi -gradle-plugin aunque tengo el archivo settings.xml anterior apuntando al repositorio maven remoto.

Si en lugar de especificar el repositorio en el interior mi archivo build.gradle funciona:

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

Sobre la base de este post:

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

parece que Gradle considera la configuración. archivo xml, entonces, ¿qué está mal?

Respuesta

15

Hay un billete abierto relacionado con este que será implementado con suerte:

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

Pero como solución alternativa que puede utilizar algunas secuencias de comandos en el maravilloso build.gradle para lograrlo. En mi caso, necesitaba la información de autenticación de settings.xml. Pero esto podría adaptarse fácilmente para obtener información del repositorio.

Ejemplo:

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"]) 
    } 


    } 
} 
+0

Esta es una gran respuesta, y es útil también para información general (scripts en el archivo de compilación Gradle).También recomendaría a cualquiera que lea esto que vea la respuesta de @PeterKahn a continuación, que no requiere scripts adicionales, pero sí requiere complementos adicionales. – mnd

4

Debe declarar todos los repositorios en su script de compilación de Gradle. settings.xml solo se usa para buscar la ubicación del repositorio local de Maven, por ejemplo al resolver repositories { mavenLocal() }.

2

Ver: https://github.com/home1-oss/maven-settings-decoder

lo uso en la escritura de la estructura Gradle para evitar exponer la contraseña nexo en build.gradle o variable de entorno.

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()") 
... 
Cuestiones relacionadas