Comment puis-je mettre à jour une propriété dans une Maven POM?
j'ai deux haut-niveau des projets Maven, backend
et frontend
, qui avance les versions à leur propre rythme. Puisque chacun a plusieurs modules, je définis mes versions de dépendances en dependencyManagement
sections dans le parent / aggregate POMs et utiliser une propriété pour le numéro de version.
je veux mettre à jour proprement la propriété avec le numéro de version sur frontend
, de préférence arbitrairement, mais je peux vivre avec l'exigence d'une version live upstream pour correspondre. J'ai essayé d'utiliser versions:update-property
, mais cet objectif semble complètement non fonctionnel; qu'il y ait ou non une version amont correspondante, j'obtiens ce résultat de débogage:
$ mvn versions:update-property -Dproperty=frontend.version -DnewVersion=0.13.2 -DautoLinkItems=false -X
...
[DEBUG] Searching for properties associated with builders
[DEBUG] Property ${frontend.version}
[DEBUG] Property ${frontend.version}: Looks like this property is not associated with any dependency...
[DEBUG] Property ${frontend.version}: Set of valid available versions is [0.9.0, 0.9.1, 0.9.2, 0.9.3, 0.9.4, 0.9.5, 0.10.0, 0.10.1, 0.11.0, 0.12.0, 0.13.0, 0.13.1, 0.13.2, 0.13.3]
[DEBUG] Property ${frontend.version}: Restricting results to 0.13.2
[DEBUG] Property ${frontend.version}: Current winner is: null
[DEBUG] Property ${frontend.version}: Searching reactor for a valid version...
[DEBUG] Property ${frontend.version}: Set of valid available versions from the reactor is []
[INFO] Property ${frontend.version}: Leaving unchanged as 0.13.1
[INFO] ------------------------------------------------------------------------
j'ai spécifié -DautoLinkItems=false
, et cela semble avoir aucun effet; versions-maven-plugin
scanne toujours tous mes POMs pour les dépendances correspondantes, lève ses mains, et démissionne. J'ai aussi essayé la configuration de searchReactor
false
pour cette propriété dans la configuration du plugin. Il semble que le plugin (1) de manière incorrecte scanne les dépendances, même quand j'ai explicitement dit de l'ignorer et (2) même filtre explicite match spécifique.
Existe-t-il un moyen simple de réécrire une entrée D'une propriété Maven à une valeur spécifique, en forçant versions-maven-plugin
pour faire ce que je dis sans validation pour un numéro de version ou en utilisant un autre but? Je préfère éviter un outil comme sed
cela ne veut pas comprendre XML (comme je l'ai vu a recommandé à une question similaire), mais je serais d'accord avec une simple XPath manipulation.
6 réponses
le paramètre newVersion est mal documenté (comme la plupart de ce plugin). En vérifiant les tests d'intégration, je vois qu'il faut un Maven version de la gamme pas un simple numéro de version. En outre, il ne vous permet pas de fournir n'importe quelle valeur - il doit être un valide que Maven peut résoudre. Le paramètre serait mieux s'il s'appelait constrainRange
Pour quelqu'un d'autre à l'avenir, essayer ceci:
mvn versions:update-property -Dproperty=frontend.version -DnewVersion=[0.13.2]
si vous avez besoin de mettre à jour vers un snapshot assurez-vous que vous la propriété allowSnapshots
true
mvn versions:update-property -Dproperty=frontend.version -DnewVersion=[0.13.2] -DallowSnapshots=true
Existe-t-il un moyen simple de réécrire une entrée D'une propriété Maven à une valeur spécifique
depuis la version 2.5
nous pouvons utiliser set-property
( documentation):
mvn versions:set-property -Dproperty=your.property -DnewVersion=arbitrary_value
tel que documenté, le set-property
goal n'effectue pas de 'contrôles de bon sens' sur la valeur que vous spécifiez, donc il devrait toujours fonctionner, mais vous devriez utiliser avec soin.
comment mettre à jour une propriété dans une POM existante:
Essayez d'utiliser le filtrage par maven-ressources-plugin:
- spécifier la version dans le fichier de propriété;
- ajouter un filtre personnalisé avec chemin d'accès à ce fichier (enfant pom.xml, où la dépendance doit être injecté);
- mise à jour de version dans le fichier de propriété;
- lancer la construction.
les Avantages:
- il devrait travailler;
- version est spécifié qu'une seule fois;
- le fichier de propriétés peut être ajouté sous contrôle de version;
- processus-ressources est l'un des premiers maven étapes du cycle de vie.
Inconvénients:
- Eh bien, pom.xml utilise encore réservé;
- travail supplémentaire pour mettre à jour automatiquement le fichier de propriété à partir de la construction initiale (trop compliqué, je suppose qu'il devrait y avoir des facilités solution.)
comment fournir la propriété sur le temps de construction:
vous pouvez spécifier n'importe quelle propriété par paramètre de construction.
par exemple, j'ai une propriété dans mon pom.xml comme:
<properties>
<build.date>TODAY</build.date>
</properties>
Pour changer en cours de construction, je simplement utiliser le paramètre:
mvn compile -Dbuild.date=10.10.2010
je suis presque sûr que ça marchera aussi pour la version. En outre, les propriétés des projets de haut niveau sont héritées par les enfants.
j'ai eu le même problème et je n'ai rien trouvé qui change les propriétés de pom dans le fichier. J'ai fini par utiliser sed comme vous l'avez suggéré:
cat pom.xml | sed -e "s%<util.version>0.0.1-SNAPSHOT</util.version>%<util.version>$bamboo_planRepository_branch</util.version>%" > pom.xml.transformed;
rm pom.xml;
mv pom.xml.transformed pom.xml;
quand vous définissez votre propriété dans la pom.xml vous devez déclarer comme intervalle si vous voulez que la mise à jour-propriété fonctionne.
je veux dire, bien sûr votre frontend.la version est définie comme suit:
<frontend.version>0.13.1</frontend.version>
alors le plugin lorsque vous définissez-DnewVersion=0.13.2 ne reconnaît pas la valeur comme valeur valide. Au lieu de si vous définissez un intervalle, le plugin fonctionne.
<frontend.version>[0.13.0,0.13.2]</frontend.version>
Dans un de mes test j'obtiens le résultat suivant:
mvn versions:update-property -Dproperty=absis.version -DnewVersion=[2.20.4] -X
[DEBUG] Property ${test.version}: Set of valid available versions is [2.19.0-RC-REVISION-1, 2.19.0-RC0.1, 2.19.0-RC0.2, 2.19.0-RC0.3, 2.19.0-RC0.4, 2.19.0-RC0.5, 2.19.0-RC0.6, 2.19.0-RC0.7, 2.19.0-RC1, 2.19.0-RC2, 2.19.0-RC3, 2.19.0, 2.19.0-revision, 2.19.0-revision2, 2.19.0.2, 2.19.1, 2.19.2, 2.19.3, 2.19.4, 2.20.0-RC0, 2.20.0-RC0.1, 2.20.0-RC1, 2.20.0-RC2, 2.20.0-RC3, 2.20.0, 2.20.0-PRUEBA-VERSION, 2.20.0-PRUEBA-VERSION-2, 2.20.0-PRUEBA-VERSION-3, 2.20.0i-RC1, 2.20.0i-RC1.1, 2.20.0i, 2.20.0i.2, 2.20.1, 2.20.2, 2.20.4, 2.20.5, 2.20.5-LT, 2.20.5.1, 2.20.6i-RC1, 2.21.0-RCtest1, 2.21.0-RCtest2]
[DEBUG] Property ${test.version}: Restricting results to [2.20.4,2.20.4]
[DEBUG] Property ${test.version}: Current winner is: 2.20.4
[DEBUG] Property ${test.version}: Searching reactor for a valid version...
[DEBUG] Property ${test.version}: Set of valid available versions from the reactor is []
[INFO] Updated ${test.version} from [2.19.0,2.21.0-SNAPSHOT] to 2.20.4
acheter vous devez modifier la valeur de la propriété à une plage.
c'est une honte parce que je ne peux pas utiliser la portée dans ma définition de poms.
ce qui suit s'applique aux versions:update-properties goal. Je pense que la même chose s'appliquerait versions:mise à jour-propriété.
le but par défaut ne fonctionne que si une définition de propriété correspondante et une déclaration de dépendance apparaissent dans le même fichier POM.
si, par exemple, la propriété est définie dans une POM de projet mais utilisée dans une déclaration de dépendance dans une POM de module, alors la configuration suivante est nécessaire dans la POM de projet pour la mise à jour automatique via des Versions plugin.
<properties>
<my.version>3.7.11</my.version>
</properties>
...
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>versions-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<properties>
<property>
<name>my.version</name>
<dependencies>
<dependency>
<groupId>com.acme.test</groupId>
<artifactId>demo-arti</artifactId>
</dependency>
</dependencies>
</property>
</properties>
</configuration>
</plugin>
</plugins>
</build>
la configuration du plugin entre en action lorsque les Versions du plugin maven tournent contre le POM et tentent de mettre à jour la propriété. La configuration indique au plugin Versions que la propriété sera utilisée pour la dépendance indiquée "Dans un POM somewhere" même si elle n'est pas dans le POM présent.