Eredità versione progetto Maven - Devo specificare la versione padre?


189

Ho due progetti: Progetto principale: A, Progetto secondario: B

A / pom.xml:

<groupId>com.dummy.bla</groupId>
<artifactId>parent</artifactId>
<version>0.1-SNAPSHOT</version>
<packaging>pom</packaging>

E in B / pom.xml, ho:

    <parent>
        <groupId>com.dummy.bla</groupId>
        <artifactId>parent</artifactId>
        <version>0.1-SNAPSHOT</version>     
    </parent>

    <groupId>com.dummy.bla.sub</groupId>
    <artifactId>kid</artifactId>

Voglio che B erediti la versione dal genitore, quindi l'unico posto nel mio caso che devo mettere 0.1-SNAPSHOTè A/pom.xml. Ma se rimuovo <version>0.1-SNAPSHOT</version>da B/pom.xmlsotto la sezione genitore, Maven si lamenta della versione mancante per il genitore.

C'è un modo che posso semplicemente usare ${project.version}o qualcosa del genere per evitare di avere 01.-SNAPSHOTentrambi i poms?


4
Dovrai aspettare Maven 3.1, temo.
Percezione



1
Il link sopra è stato spostato. Lo stato finale era "Chiuso / Non risolto
jocull

Risposte:


86

EDIT: da Maven 3.5.0 esiste una buona soluzione per utilizzare il ${revision}segnaposto. Vedi la risposta di FrVaBe per i dettagli. Per le precedenti versioni di Maven, vedi la mia risposta originale di seguito.


No, non c'è. Devi sempre specificare la versione del genitore. Fortunatamente, è ereditato dalla versione del modulo ciò che è desiderabile nella maggior parte dei casi. Inoltre, la dichiarazione di versione di questo genitore viene respinta automaticamente dal plug-in di rilascio Maven, quindi - in realtà - non è un problema che tu abbia la versione in 2 posizioni fintanto che usi il plug-in di rilascio Maven per rilasciare o semplicemente eseguire il bump delle versioni.

Si noti che ci sono alcuni casi in cui questo comportamento è effettivamente abbastanza OK e offre maggiore flessibilità di cui potresti aver bisogno. A volte vuoi usare alcune delle versioni precedenti del genitore per ereditare, tuttavia questo non è un caso tradizionale.


3
Adesso puoi usare il ${revision}segnaposto per questo. Vedi la mia risposta ;-)
FrVaBe

2
Questo è ormai obsoleto - assegno @ risposta di FrVaBe qui: stackoverflow.com/a/51969067/514483
robd

@FrVaBe cosa succede se abbiamo genitori nidificati con versioni diverse? Non possiamo usare una proprietà $ {revision} lì, non è abbastanza.
halil

@halil La domanda riguarda l'ereditarietà di una versione da un genitore con l'obiettivo di avere la stessa versione in due artefatti. Se hai genitori diversi con versioni diverse (in una gerarchia di ereditarietà) probabilmente non li trasformerai tutti nella stessa versione. Pertanto non capisco pienamente il commento.
FrVaBe,

86

Maven non è progettato per funzionare in questo modo, ma esiste una soluzione alternativa per raggiungere questo obiettivo (forse con effetti collaterali, dovrai provare). Il trucco è dire al progetto figlio di trovare il suo genitore attraverso il suo percorso relativo piuttosto che le sue coordinate di pura maven, oltre a esternare il numero di versione in una proprietà:

Padre Pom

<groupId>com.dummy.bla</groupId>
<artifactId>parent</artifactId>
<version>${global.version}</version>
<packaging>pom</packaging>

<properties>
   <!-- Unique entry point for version number management --> 
   <global.version>0.1-SNAPSHOT</global.version>
</properties>

Pom pom

<parent>
   <groupId>com.dummy.bla</groupId>
   <artifactId>parent</artifactId>
   <version>${global.version}</version>
   <relativePath>..</relativePath>    
</parent>

<groupId>com.dummy.bla.sub</groupId>
<artifactId>kid</artifactId>

Ho usato quel trucco per un po 'per uno dei miei progetti, senza alcun problema specifico, tranne il fatto che maven registra molti avvertimenti all'inizio della costruzione, il che non è molto elegante.

MODIFICARE

Sembra che la versione 3.0.4 non consenta più tale configurazione.


2
sì, temo che Maven non sia progettato per funzionare in questo modo, meglio che rimanga con le versioni nel sub pom.xml. il plugin di rilascio di Maven non si preoccupa comunque delle versioni lì.
Shengjie,

7
per 3.0.5 funziona bene. dovresti comunque mettere <properties> in cima.
sabato

7
Funziona in 3.2.3. La posizione di <proprietà> non ha importanza. Riceverai un avviso però:'version' contains an expression but should be a constant.
kapex

4
Per favore, stai attento con questo. Questo non funziona quando il tuo progetto fa riferimento a un altro progetto. La proprietà non verrà risolta e verrà trattata letteralmente (ad esempio $ {my.version}). Ciò comporterà un errore durante la risoluzione delle dipendenze.
spekdrum,

2
Lo sto usando anche da un po 'di tempo e funziona perfettamente (attualmente con Maven 3.3.9) per un singolo progetto multi modulo. Tuttavia, non appena il tuo progetto diventa una dipendenza di un altro progetto, le cose diventano davvero difficili. Consiglio davvero di adottare il suggerimento proposto da @pay di seguito.
geniale

81

Il modo più semplice per aggiornare le versioni IMO:

$ mvn versions:set -DgenerateBackupPoms=false

(fallo nella tua cartella pom principale / principale).

I tuoi POM vengono analizzati e ti viene chiesto quale versione impostare.


17
Puoi anche aggiungere -DnewVersion = {versionToBeUpdated} per evitare di inserirlo in modo interattivo.
Mukesh,

1
Penso che questa sia la risposta migliore, automatizza le modifiche di versione senza interrompere i sottoprogetti (a cui non potresti fare riferimento senza il pom padre).
Tarek,

Sì! Questa è la risposta 🙌
aaiezza,

Se la versione Pom figlio e padre sono inizialmente diverse, aggiornale prima in modo che corrispondano, mvn versions:update-child-modules altrimenti verrà saltata tutta la versione Pom modulo figlio.
Gautam Tadigoppula,

75

Da Maven 3.5.0 è possibile utilizzare il ${revision}segnaposto per quello. L'uso è documentato qui: Maven CI Friendly Versions .

In breve, il pom padre appare così (citato dalla documentazione di Apache):

<project>
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.apache</groupId>
    <artifactId>apache</artifactId>
    <version>18</version>
  </parent>
  <groupId>org.apache.maven.ci</groupId>
  <artifactId>ci-parent</artifactId>
  <name>First CI Friendly</name>
  <version>${revision}</version>
  ...
  <properties>
    <revision>1.0.0-SNAPSHOT</revision>
  </properties>
  <modules>
    <module>child1</module>
    ..
  </modules>
</project>

e il bambino pom piace questo

<project>
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.apache.maven.ci</groupId>
    <artifactId>ci-parent</artifactId>
    <version>${revision}</version>
  </parent>
  <groupId>org.apache.maven.ci</groupId>
  <artifactId>ci-child</artifactId>
   ...
</project>

È inoltre necessario utilizzare il Maven Plugin Unisci per generare documenti pom con il numero di versione dedicata, per la distribuzione. Il HowTo è documentato nella documentazione collegata.

Anche @khmarbaise ha scritto un bel post BLOB su questa funzione: Maven: file POM senza una versione in esso?


Ho configurato il mio progetto come hai descritto, ma senza il "Flatten Maven Plugin" e sembra funzionare come previsto, è possibile? Inoltre ho riscontrato un errore con la versione 3.2.1, ma la versione 3.3.9+ sembra funzionare bene.
Max

@Max Dipende da ciò che definisci "lavoro come previsto". Immagino che la build passerà, ma l'installazione / distribuzione in un repository probabilmente non sarà una buona idea perché non c'è un numero di versione nel figlio secondario ma solo un segnaposto (vedi documentazione )
FrVaBe,

Uso <versione> $ {revisione} </versione> in pom padre con la proprietà predefinita (<proprietà> <versione> 0.1-default </versione> </properties>. Anche i figli figlio usano <versione> $ {revisione} < / version>. Uso "mvn clean install -Drevision = 0.1. $ {bamboo.buildNumber}". Quando eseguo la scansione dei log della distribuzione, tutto è impostato su 0.1.820 e 0.1-default non è nemmeno nei log (820 è il buildNumber.) Quando eseguo la scansione del jar risultante vedo "Implementation-Version: 0.1.820" nel file manifest e anche "version = 0.1.820" in un file pom.properties. Il file pom stesso ha <version> $ {revisione} </version>. Quindi penso che vada bene?
Max

1
@Max Prova a risolvere un vaso in cui la versione è ${revision} nel pom (nel repository di Maven) come dipendenza in un altro progetto. Non penso che funzionerà.
FrVaBe,

Questo è utile tranne quando faccio una liberatoria. Ciò sostituisce ${revision}il tag della versione con la nuova versione
Mike D

21

Come ha detto Yanflea, c'è un modo per aggirare questo.

In Maven 3.5.0 è possibile utilizzare il seguente modo per trasferire la versione dal progetto padre:

POM.xml padre

<project ...>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.mydomain</groupId>
    <artifactId>myprojectparent</artifactId>
    <packaging>pom</packaging>
    <version>${myversion}</version>
    <name>MyProjectParent</name>

    <properties>
        <myversion>0.1-SNAPSHOT</myversion>
    </properties>

    <modules>
        <module>modulefolder</module>
    </modules>
    ...
</project>

Modulo POM.xml

<project ...>
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>com.mydomain</groupId>
        <artifactId>myprojectmodule</artifactId>
        <version>${myversion}</version> <!-- This still needs to be set, but you can use properties from parent -->
    </parent>

    <groupId>se.car_o_liner</groupId>
    <artifactId>vinno</artifactId>
    <packaging>war</packaging>
    <name>Vinno</name>
    <!-- Note that there's no version specified; it's inherited from parent -->
    ...
</project>

Sei libero di passare myversiona ciò che desideri che non è una proprietà riservata.


3
Quando fa riferimento a un modulo di un altro progetto, Maven non risolve la proprietà. È normale?
LeoLozes,

Credo che questa domanda possa essere degna della sua voce e non essere in un commento come questo. Senza vedere il tuo codice posso solo indovinarlo selvaggiamente.
eFox,

@LeoLozes Hai risolto il tuo problema (modulo di riferimento da un altro progetto)?
Morteza Malvandi,

@MortezaMalvandi si! La mia risposta è in fondo :)
LeoLozes il

2
Maven 3.6.0 fornisce un avviso per questa configurazione: "Si consiglia vivamente di risolvere questi problemi perché minacciano la stabilità della build." "Per questo motivo, le future versioni di Maven potrebbero non supportare più la costruzione di progetti così malformati".
d2k2,

18

Puoi anche usare:

$ mvn release:update-versions -DdevelopmentVersion={version}

per aggiornare i numeri di versione nei tuoi POM.


10

La risposta di eFox ha funzionato per un singolo progetto, ma non quando stavo facendo riferimento a un modulo da un altro (i pom.xml erano ancora memorizzati nel mio .m2con la proprietà invece della versione).

Tuttavia, funziona se lo si combina con il flatten-maven-plugin, poiché genera i pom con la versione corretta, non la proprietà.

L'unica opzione che ho modificato nella definizione del plug-in è la outputDirectory, è vuota per impostazione predefinita, ma preferisco averla target, che è impostata nella mia .gitignoreconfigurazione:

<plugin>
   <groupId>org.codehaus.mojo</groupId>
   <artifactId>flatten-maven-plugin</artifactId>
   <version>1.0.1</version>
   <configuration>
      <updatePomFile>true</updatePomFile>
      <outputDirectory>target</outputDirectory>
   </configuration>
   <executions>
      <execution>
         <id>flatten</id>
         <phase>process-resources</phase>
         <goals>
            <goal>flatten</goal>
         </goals>
      </execution>
   </executions>
</plugin>

La configurazione del plug-in va nel pom.xml padre



0
<parent>
    <groupId>com.dummy.bla</groupId>
    <artifactId>parent</artifactId>
    <version>0.1-SNAPSHOT</version>     
 </parent>

 <groupId>com.dummy.bla.sub</groupId>
 <artifactId>kid</artifactId>

Intendi che vuoi rimuovere la versione dal blocco genitore di B's pom, penso che non puoi farlo, il groupId, artefactId e version hanno specificato le coordinate pom del genitore, ciò che puoi omettere è la versione child.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.