2011-06-22 8 views
5

Dans ma version Maven, je souhaiterais pouvoir définir des valeurs par défaut (par exemple pour la connexion à la base de données) dans pom.xml, mais je voudrais que l'utilisateur puisse les modifier sans avoir à modifier pom.xml directement. Par exemple, dans une construction Ant, vous pouvez définir les propriétés par défaut dans foo.properties, mais Ant cherchera des remplacements pour chacun d'entre eux dans un foo.$USERNAME.properties. Ce dernier n'est généralement pas vérifié dans le contrôle de source, ce qui élimine le problème des développeurs validant accidentellement leurs remplacements des propriétés par défaut. Est-ce que Maven offre un service similaire?Propriétés Maven par utilisateur

Pour rendre le problème un peu plus concret, je suppose avoir les éléments suivants définis dans 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> 

un utilisateur peut remplacer ces propriétés sans modifier le pom.xml directement?

Répondre

9

Vous pouvez spécifier des propriétés sur la ligne de commande en utilisant -Dpropertyname=value ou l'utilisateur peut spécifier des propriétés dans leur .m2/settings.xml.

+0

+1 le fichier settings.xml est un fichier local pour l'utilisateur - meilleur endroit pour des choses comme ceci – Qwerky

+0

Il semble que je puisse y parvenir en définissant un profil '' dans 'settings.xml' qui contient le valeurs de propriété dominantes, est-ce exact? –

+0

Vous pouvez être conscient que les profils activeByDefault ne sont pas sélectionnés si vous spécifiez _any_ profile lors de la création. Je les mettrais simplement dans la section des propriétés normales du POM si j'étais vous, et laissez l'utilisateur les contourner. – artbristol

2

Vous pouvez réaliser ceci avec des profils de construction. Voir Introduction to build profiles pour plus d'informations.

+0

Pourriez-vous fournir un exemple de comment utiliser les profils de construction pour résoudre le problème de connexion DB problème décrit ci-dessus ? –

0

Si vous ne souhaitez pas ajouter de propriétés sur la ligne de commande, mais définir certains paramètres une seule fois (et si vous pouvez accepter les chaînes vides par défaut); vous pouvez utiliser des variables d'environnement comme celui-ci:

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

Edit: J'ai essayé de trouver un moyen de définir une valeur par défaut pour ${variable} si la variable est vide/non défini, mais je ne l'ai pas trouvé quoi que ce soit , cela semble manquer (la suggestion fréquente est d'utiliser des profils mais ce n'est pas tout à fait pareil). Je préférerais que vous puissiez simplement définir certaines variables d'environnement et avoir des valeurs par défaut raisonnables afin que vous puissiez simplement exécuter mvn clean install (et non pas les chaînes de caractères 20-40 que j'utilise normalement pour construire notre projet). Si les valeurs par défaut est possible j'aimerais entendre comment ...

BTW, si vous êtes déjà habitué à Ant, j'ai entendu dire que vous pouvez appeler les tâches Ant de maven en quelque sorte (ne sais pas comment , cependant), peut-être pourriez-vous l'utiliser d'une manière ou d'une autre?

+0

Merci pour la suggestion, mais une valeur par défaut des chaînes vides ne fonctionnera pas –

1

J'utilisé settings.xml pour remplacer ces propriétés en ajoutant ce qui suit à la section <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> 

Dans ce cas, les forçages ne prendra effet que si un -DrefreshDB est passé à la commande mvn. Pour activer ces remplacements chaque Maven temps est invoqué aussi ajouter ce qui suit à settings.xml

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

Si le profil est ajouté à <activeProfiles> alors l'élément <activation> doit être retiré.

Questions connexes