2011-06-22 16 views
5

En mi compilación Maven me gustaría poder definir valores predeterminados (p. Ej., Para la conexión de la base de datos) en pom.xml, pero me gustaría que el usuario pueda sobrescribirlos sin tener que modificar pom.xml directamente.por usuario Maven properties

A modo de ejemplo, en una compilación Ant puede definir las propiedades predeterminadas en foo.properties, pero Ant buscará sustituciones para cada uno de estos en un foo.$USERNAME.properties. Este último generalmente no se controla en el control de origen, lo que elimina el problema de que los desarrolladores accidentalmente confirmen sus modificaciones de las propiedades predeterminadas. ¿Maven ofrece una instalación similar?

Para hacer el problema un poco más concreto, asume que tienen las siguientes define en pom.xml

<properties> 
    <db.url>jdbc:jtds:sqlserver://10.10.10.10:1433/somedb</db.url> 
    <db.driver>net.sourceforge.jtds.jdbc.Driver</db.driver> 
    <db.username>default_user</db.username> 
    <db.password>secret</db.password> 
</properties> 

Puede un usuario anular estas propiedades sin editar el pom.xml directamente?

Respuesta

9

Puede especificar propiedades en la línea de comando usando -Dpropertyname=value, o el usuario puede especificar propiedades en su .m2/settings.xml.

+0

+1 el archivo settings.xml es un archivo local para el usuario - el mejor lugar para cosas como esta – Qwerky

+0

Parece que puedo lograr esto definiendo un perfil '' en 'settings.xml' que contiene el anulando los valores de propiedad, ¿verdad? –

+0

Puede tener en cuenta que los perfiles activeByDefault no se seleccionan si especifica _any_ profile cuando construye. Simplemente los pondría en la sección de propiedades normales del POM si fuera usted, y dejaría que el usuario los anule. – artbristol

2

Puede lograr esto con los perfiles de compilación. Ver Introduction to build profiles para más información.

+0

¿Podrías dar un ejemplo de cómo puedo usar los perfiles de compilación para resolver el problema del problema de conexiones a DB descrito anteriormente? ? –

0

Si no desea agregar propiedades en la línea de comandos, pero establezca alguna configuración una vez (y si puede aceptar el valor predeterminado siendo cadenas vacías); usted podría utilizar variables de entorno como éste:

<something>${env.ENVNAME}</something> 
<!-- something will be blank "" unless ENVNAME is set --> 

Editar: que he estado tratando de encontrar una manera de definir unos valores por defecto para ${variable} si la variable está vacía/indefinido, pero no he encontrado nada , esto parece estar perdido (la sugerencia frecuente es usar perfiles, pero no es lo mismo). Preferiría si pudiera simplemente establecer algunas variables de entorno y tener valores predeterminados razonables para que pueda ejecutar mvn clean install (y no las cadenas de caracteres de 20-40 que normalmente uso para construir nuestro proyecto). Si los valores por defecto es posible me gustaría saber cómo ...

Por cierto, si ya está acostumbrado a Ant, he oído que puede llamar tareas Ant de algún modo experto (no sé cómo , sin embargo), ¿quizás podrías usar eso de alguna manera?

+0

Gracias por la sugerencia, pero un valor predeterminado de cadenas vacías no funcionará –

1

I utilizarse settings.xml para anular estas propiedades mediante la adición de lo siguiente a la sección <profiles>

<profile> 
    <id>override-database-properties</id> 
    <activation> 
    <property> 
     <name>refreshDB</name> 
    </property> 
    </activation> 

    <properties> 
    <db.schema_name>store_don</db.schema_name> 
    </properties> 
</profile> 

En este caso las sustituciones solamente tendrán efecto si un -DrefreshDB se pasa al comando mvn. Para activar estas anulaciones cada vez que se invoca Maven también añadir lo siguiente a settings.xml

<activeProfiles> 
    <activeProfile>alwaysActiveProfile</activeProfile> 
</activeProfiles> 

Si se agrega el perfil a <activeProfiles> entonces el elemento <activation> debe ser eliminado.

Cuestiones relacionadas