2012-05-24 20 views
7

Tengo un archivo Maven settings.xml en mi directorio ~/.m2; se parece a esto:Usando las propiedades Maven settings.xml dentro del contexto Spring

<settings> 
    <profiles> 
     <profile> 
      <id>mike</id> 
      <properties> 
       <db.driver>org.postgresql.Driver</db.driver> 
       <db.type>postgresql</db.type> 
       <db.host>localhost</db.host> 
       <db.port>5432</db.port> 
       <db.url>jdbc:${db.type}://${db.host}:${db.port}/dbname</db.url> 
      </properties> 
     </profile> 
    </profiles> 
    <activeProfiles> 
     <activeProfile>mike</activeProfile> 
    </activeProfiles> 
    <servers> 
     <server> 
      <id>server_id</id> 
      <username>mike</username> 
      <password>{some_encrypted_password}</password> 
     </server> 
    </servers> 
</settings> 

Me gustaría utilizar estas propiedades el doble

  • Una vez dentro de la fase de Maven integration-test de configurar y derribar mi base de datos. Usando el filtrado Maven, esto está funcionando perfectamente.
  • Una segunda vez cuando ejecuto mi aplicación Spring, lo que significa que necesito sustituir estas propiedades en mi archivo servlet-context.xml durante la fase resources:resources de Maven. Para las propiedades en la sección superior de settings.xml, como ${db.url}, esto funciona bien. No puedo encontrar la forma de sustituir mi nombre de usuario de base de datos y la contraseña (descifrada) en el archivo Spring servlet-context.xml.

La parte pertinente de mi archivo servlet-context.xml parece:

<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName"><value>${db.driver}</value></property> 
    <property name="url"><value>${db.url}</value></property> 
    <property name="username"><value>${username}</value></property> 
    <property name="password"><value>${password}</value></property> 
</bean> 

El objetivo final aquí es que cada desarrollador tiene su propia configuración de Maven (y base de datos en su propia máquina para pruebas de integración). ..Y una configuración similar en el servidor de Jenkins. No queremos compartir un nombre de usuario/contraseña/etc común.

Respuesta

2

Hay una forma de filtrar los recursos web mediante la configuración de Maven War Plugin. Consulte this para obtener un fragmento de los documentos del complemento oficial.

Y, por cierto, recomiendo reconsiderar esta forma de filtrado para proporcionar una configuración de tiempo de ejecución en tiempo de compilación. Solo tenga en cuenta que tiene que reconstruir el mismo código para simplemente preparar el paquete para otro entorno (o, alternativamente, editar el contenido del paquete). Puede usar elementos específicos del servidor de aplicaciones para esto (al menos JBoss tiene uno) o usar Spring para que AFAIR también se pueda configurar así.

+0

Ese punto acerca de volver a compilar es válido. Definitivamente voy a tener que investigar eso más, ya que es un anti-patrón que espero evitar. Definitivamente necesita esto para ejecutarse en un estilo CI/CD. Pero, al mismo tiempo, intento volver a utilizar la información que ya existe y que está almacenada en la 'configuración.xml' – Mike

+0

OK, es realmente bueno que va a refactorizar esto. Por ahora, como dije, use este filtrado de recursos web. Debería funcionar y permitirte tener esta configuración en un solo lugar, como dijiste. –

+0

Spring 3.1 introdujo una carga de cosas nuevas para este tipo de escenario: http://blog.springsource.org/2011/02/15/spring-3-1-m1-unified-property-management/ – artbristol

1

Le recomiendo que utilice un archivo de propiedad en el medio. Quiero decir: la aplicación Spring cargaría los valores de las propiedades del archivo de propiedades usando context:property-placeholder y Maven sería quien reemplazaría las variables $ {...} usando los valores de settings.xml usando el filtrado.

Su archivo de propiedades:

db.driver=${db.driver} 
db.url=${db.url} 
username=${username} 
password=${password} 

Su servlet-context.xml archivo

<context:property-placeholder location="classpath:your-property-file.properties" /> 

<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName"><value>${db.driver}</value></property> 
    <property name="url"><value>${db.url}</value></property> 
    <property name="username"><value>${username}</value></property> 
    <property name="password"><value>${password}</value></property> 
</bean> 

En su pom.xml

<resources> 
    ... 
    <resource> 
     <directory>src/main/resources</directory> 
     <filtering>true</filtering> 
    </resource> 
    ... 
</resources> 
0

no he probado, pero según esta maven wiki page, deberías poder referirte a las propiedades en settings.xml usando settings. prefijo. Entonces, ${settings.servers.server.username} idealmente debe devolver username en settings.xml.

+0

Eso está dentro de el alcance de Maven, no de Spring, por lo que no pudo acceder a esos en tiempo de ejecución, en primavera. Solo puedes usarlos con la opción de filtro. –

Cuestiones relacionadas