web-dev-qa-db-fra.com

Comment puis-je mettre à jour une propriété dans un POM Maven?

J'ai deux projets Maven de niveau supérieur, backend et frontend, qui font avancer les versions à leur propre rythme. Etant donné qu'ils ont plusieurs modules, je définis mes versions de dépendance dans les sections dependencyManagement des POM parent/agrégés et utilise 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 de manière arbitraire, mais je peux vivre avec la nécessité de faire correspondre une version en direct en amont. J'ai essayé d'utiliser versions:update-property , mais cet objectif semble être complètement non fonctionnel; peu importe qu'il y ait ou non une version en amont correspondante, j'obtiens cette sortie 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 n'avoir aucun effet; versions-maven-plugin continue à analyser tous mes POM pour rechercher les dépendances correspondantes, lève les mains au ciel et quitte. J'ai également essayé de définir searchReactor sur false pour cette propriété dans la configuration du plug-in. Il semble que le plugin (1) analyse de manière incorrecte les dépendances même lorsque je leur ai explicitement dit de les ignorer et même (2) de filtrer une correspondance spécifique explicite.

Existe-t-il un moyen simple de réécrire une entrée de propriété Maven sur une valeur spécifique, en forçant versions-maven-plugin à faire ce que je dis sans valider pour un numéro de version ou en utilisant un autre objectif? Je préférerais éviter un outil tel que sed qui ne comprend pas XML (comme je l'ai recommandé dans une question similaire), mais je serais d'accord avec une simple manipulation de XPath.

22
chrylis

Le paramètre newVersion est mal documenté (tout comme la plupart des plugins). En vérifiant les tests d'intégration, je constate qu'il faut une plage de versions Maven pas un simple numéro de version. En outre, cela ne vous permet pas de fournir une valeur, mais doit être une valeur valide que Maven peut résoudre. Le paramètre serait meilleur s'il s'appelait constrainRange

Pour quelqu'un d'autre à l'avenir, essayez ceci:

mvn versions:update-property -Dproperty=frontend.version -DnewVersion=[0.13.2]  

Si vous devez mettre à jour un instantané, assurez-vous de définir la propriété allowSnapshots sur true.

mvn versions:update-property -Dproperty=frontend.version -DnewVersion=[0.13.2] -DallowSnapshots=true
12
drekbour

Existe-t-il un moyen simple de réécrire une entrée de propriété Maven sur 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

Comme documenté, l'objectif set-property n'effectue aucun «contrôle d'intégrité» sur la valeur que vous spécifiez; il devrait donc toujours fonctionner, mais vous devez l'utiliser avec prudence.

11
George Aristy

Comment mettre à jour une propriété dans un POM existant:

Essayez d’utiliser le filtrage dans maven-resource-plugin :

  1. spécifier la version dans le fichier de propriétés; 
  2. ajoute un filtre personnalisé avec un chemin d'accès à ce fichier (dans l'enfant pom.xml, où la dépendance doit être injectée);
  3. mettre à jour la version dans le fichier de propriétés;
  4. lancez la construction.

Avantages: 

  • ça devrait marcher; 
  • la version est spécifiée une seule fois;
  • le fichier de propriétés peut être ajouté sous contrôle de version;
  • process-resources est l'une des premières étapes du cycle de vie de maven.

Désavantages:

  • eh bien, (pom.xml} _ utilise toujours un espace réservé;
  • travail supplémentaire pour mettre à jour automatiquement le fichier de propriétés à partir de la construction initiale (trop compliqué, je suppose qu'il devrait y avoir une solution facile).

Comment fournir des biens en construction:

Vous pouvez spécifier n'importe quelle propriété en fonction du paramètre de construction.

Par exemple, j'ai la propriété dans mon pom.xml comme:

<properties>
    <build.date>TODAY</build.date>
</properties>

Pour le changer pendant la construction, j'utilise simplement le paramètre:

mvn compile -Dbuild.date=10.10.2010

Je suis sûr que cela fonctionnera aussi pour la version. En outre, les propriétés des projets de niveau supérieur sont héritées par les enfants.

3
arghtype

J'ai eu le même problème et rien trouvé qui modifie 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;
2
mojoo-de

Les éléments suivants s'appliquent aux versions: objectif update-properties. Je pense que la même chose s'appliquerait aux versions: update-property.

L'objectif par défaut ne fonctionne que si une définition de propriété et une déclaration de dépendance correspondantes apparaissent dans le même fichier POM.

Si, par exemple, la propriété est définie dans un POM de projet mais utilisée dans une déclaration de dépendance dans un POM de module, la configuration suivante est requise dans le POM de projet pour la mise à jour automatique via le plugin Versions.

  <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 plug-in entre en action lorsque le plug-in Versions maven s'exécute sur le POM et tente de mettre à jour la propriété. La configuration indique au plug-in Versions que la propriété sera utilisée pour la dépendance indiquée "dans un POM quelque part", même si ce n'est pas dans le POM actuel.

0
Darren Yeats

Lorsque vous définissez votre propriété dans le fichier pom.xml, vous devez indiquer un intervalle si vous souhaitez que la propriété update-property fonctionne.

Je veux dire, bien sûr que votre version frontend.version est définie comme suit:

<frontend.version>0.13.1</frontend.version>

Ensuite, le plug-in lorsque vous définissez -DnewVersion = 0.13.2 ne reconnaît pas la valeur en tant que valeur valide. Au lieu de si vous définissez comme un intervalle, le plugin fonctionne.

<frontend.version>[0.13.0,0.13.2]</frontend.version>

Dans l'un de mes tests, 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é en une plage. 

C'est dommage car je ne peux pas utiliser la portée dans ma définition de poms.