2009-10-13 16 views
7

Sé que puedo recuperar algunos parámetros settings.xml usando propiedades, como por ejemplo ${settings.localRepository} para obtener la ubicación del repositorio local.Cómo obtener los valores de servidor definido en el settings.xml para usarlos en mi pom.xml?

Ahora imagine mi settings.xml contiene los siguientes servidores definición:

<servers> 
    <server> 
     <id>server-dev</id> 
     <username>devuser</username> 
     <password>devpass</password> 
    </server> 
    <server> 
     <id>server-hom</id> 
     <username>homuser</username> 
     <password>hompass</password> 
    </server> 
</servers> 

¿Hay alguna manera, dado un id de un servidor para obtener el valor de cualquier parámetro? Por ejemplo, algo así como ${settings.servers.server.server-dev.username} volvería devuser.

ya he intentado lo siguiente:

${settings.servers.server.server-dev.username} 
${settings.servers.server-dev.username} 
${settings.servers.server[server-dev].username} 
${settings.servers[server-dev].username} 

pero ninguno de ellos funcionó ...


Con respecto a este page, esto no es posible. Sin embargo, ya que es una característica no documentada correctamente, todavía tengo alguna esperanza de hacerlo de esta manera ...

Respuesta

4

no creo que es posible y creemos que sería una mala idea para exponer el valor de estas propiedades.

Como se explica en la Settings Reference, el punto de tener <servers> en el settings.xml es no distribuir valores como username o password junto con el pom.xml. Por lo tanto, exponer las propiedades para leerlas desde cualquier lugar simplemente rompería este principio y podría ser un problema de seguridad.

EDIT: Estoy pensando de nuevo sobre esto y lo que dije no es verdad.

AFAIK, Maven no expone las propiedades username y password de un servidor definido en la configuración y/o proporciona un mecanismo similar al descrito por el OP. Pero no estaría mal poder acceder a ellos desde un pom.xml.

Dicho esto, como señaló Rich, la API Maven le da acceso a los servidores definidos en la configuración (ver org.apache.maven.settings.Settings#getServer(String serverId)) por lo que debe ser posible establecer propiedades desde un Mojo (es decir, en un complemento personalizado).

Pero en realidad no estoy seguro de lo que está tratando exactamente de hacer y tal vez usar <properties> y perfiles sería un mejor enfoque. Tratar con las propiedades del entorno común (pero con valores específicos) es un buen caso de uso para los perfiles. Consulte los capítulos 11.5.1. Common Environments y 11.5.2 Protecting Secrets del Maven: The Definitive Guide libro.

+0

En general estoy de acuerdo, pero hay casos de uso para acceder a ellos dentro de la estructura, como se muestra por el nexus- maven-plugin –

1

No sé de una manera simple de hacer esto. Sin embargo, se puede escribir un pequeño plugin y enlazarlo a una fase temprana, a continuación, acceder a los valores de configuración desde el plugin y, o bien usarlos directamente en su plugin, o exponerlos como propiedades.

Se puede ver cómo leer los valores de los ajustes mirando a la fuente de la nexus-maven-plugin, y cómo establecerlos mirando el properties-maven-plugin

0

La posibilidad 1 estaría utilizando el GMaven plugin. Se puede acceder fácilmente a la configuración del servidor como:

<source> 
    def server = settings.servers.find{ it.id.equals('server-hom') } 

y luego ponerlo en las propiedades comunes

project.properties.srvuser = server.username 
</source> 

En las siguientes fases que el acceso Cann las propiedades del POM como siempre:

${srvuser} 

Posibilidad 2 definir propiedades en settings.xml como se muestra here. No se toma de la configuración del servidor, sino de algunas propiedades basadas en el perfil.

Anyway Me parece que Maven debería obtener todas las configuraciones del servidor por defecto.

9

En caso de que esté en Maven 3+, esto se puede lograr con servers-maven-extension. Una vez registrado, se puede hacer referencia al contenido de settings.xml/servers utilizando $ {settings.servers.server. < id de servidor >. <propiedad>} (por ejemplo, $ {settings.servers.server.server-dev.username}).

divulgación: Soy el encargado del mantenimiento del proyecto.

+0

¡Perfecto! ¡Buen trabajo! –

+0

De acuerdo. Tu rock Gracias por tu trabajo. –

0

Como se describe en:

Sonatype: Complete Reference 5.5.2

mejor manera es:

<settings> 
    <profiles> 
     <profile> 
      <activeByDefault>true</activeByDefault> 
      <properties> 
       <environment.type>prod</environment.type> 
       <database.password>m1ss10nimp0ss1bl3</database.password> 
      </properties> 
     </profile> 
    </profiles> 
</settings> 
Cuestiones relacionadas