2010-11-18 21 views
4

Je veux créer un projet Maven avec la structure suivante:Définir les propriétés dans maven en fonction des autres valeurs de propriété

A 
|--pom.xml 
|--B 
    |--pom.xml 
|--C 
    |--pom.xml 

où A, B et C sont des dossiers et pom.xml de B et pom.xml de C sont les enfants de pom.xml de A. Je veux avoir dans le pom.xml de B la section suivante:

<properties> 
    <some.property>B</some.property> 
</properties> 

Et dans C:

<properties> 
    <some.property>C</some.property> 
</properties> 

Et je veux en A quelque chose à définir la valeur de plusieurs autres propriétés en fonction de la valeur de une propriété. Ainsi, par exemple, en pseudocode, A ferait quelque chose comme ceci:

if (some.property == 'B') then 
    some.other.property = 'some-value-based-on-b' 
else if (some.property == 'C') then 
    some.other.property = 'some-value-based-on-c' 
... 

Je veux courir le mvn clean install se référant à la pom.xml de A (qui contient une section de module pointant vers B et C), de sorte que, pour autant que je sache, je ne peux pas utiliser de profils pour cela (puisque dans maven2 les projets tournant dans le même réacteur héritent du même profil actif, je peux utiliser maven3, mais je ne trouve pas si ça change quelque chose).

Est-ce que quelqu'un a une idée de comment faire cela?

Merci,

Répondre

6

Hors de la boîte, Maven ne peut le faire, et des solutions de contournement sont découragées (les propriétés ne sont pas censés changer au cours du cycle de vie).

Il existe plusieurs solutions de contournement cependant, mon favori étant le gmaven plugin, qui vous permet embed Groovy code in the pom.

L'extrait de code suivant définir la propriété 'abc' à 'bar' ou 'baz', selon que la propriété 'def' contient 'foo':

<plugin> 
    <groupId>org.codehaus.gmaven</groupId> 
    <artifactId>gmaven-plugin</artifactId> 
    <version>1.3</version> 
    <executions> 
     <execution> 
      <phase>validate</phase> 
      <goals> 
       <goal>execute</goal> 
      </goals> 
      <configuration> 
       <source><![CDATA[ 
pom.properties['abc']= 
    pom.properties['def'].contains('foo') ? 'bar' : 'baz'; 
       ]]></source> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

BTW, les documents sont obsolète, la version du plugin est maintenant 1.3 et le groupId a changé. Voici the current version.

+0

Cela ne fonctionne pas parfaitement, cependant. Lorsque je voulais l'utiliser pour importer des dépendances avec une portée définie par l'une des variables que je définissais dans la phase de validation, elle s'est rompue. Je suppose que la résolution des dépendances se produit avant que ce script ait le temps d'être exécuté. – Rafael

+1

Oui, je le pense. pour y parvenir, vous devez parcourir par programme les dépendances et remplacer les espaces réservés par des valeurs de propriété^shudder ^. mais ce que vous pouvez faire est de créer les dépendances par programme en premier lieu. –