Dziedziczenie wersji projektu Maven - czy muszę określać wersję nadrzędną?

Mam dwa projekty: projekt nadrzędny: a, projekt podrzędny: B

A / pom.xml:

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

I w B / pom.xml, mam:

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

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

Chcę, aby B odziedziczył wersję od rodzica, więc jedyne miejsce w moim przypadku, które muszę umieścić 0.1-SNAPSHOT, to A/pom.xml. Ale jeśli usunę <version>0.1-SNAPSHOT</version> z B/pom.xml w sekcji parent, maven narzeka na brakującą wersję dla rodzica.

Czy jest jakiś sposób, żebym mógł użyć ${project.version} lub czegoś takiego, aby uniknąć 01.-SNAPSHOT w obu pomach?

Author: Zoe, 2012-05-14

7 answers

Nie, Nie ma. zawsze musisz podać wersję rodzica. Na szczęście jest dziedziczona jako wersja modułu, co jest pożądane w większości przypadków. Co więcej, ta deklaracja wersji rodzica jest pompowana automatycznie przez Maven Release Plugin, więc-w rzeczywistości - to nie jest problem, że masz wersję w 2 miejscach tak długo, jak używasz Maven Release Plugin do zwalniania lub po prostu wpadając wersje.

Zauważ, że są pewne przypadki, kiedy to zachowanie jest rzeczywiście OK i daje więcej elastyczność, której możesz potrzebować. Czasami chcesz użyć części poprzedniej wersji rodzica do dziedziczenia, jednak nie jest to mainstreamowy przypadek.

 57
Author: Michał Kalinowski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-14 11:20:25

Maven nie jest zaprojektowany do tego, aby działać w ten sposób, ale istnieje obejście, aby osiągnąć ten cel(może z efektami ubocznymi, będziesz musiał spróbować). Sztuczka polega na tym, aby powiedzieć projektowi potomnemu, aby znalazł rodzica za pomocą względnej ścieżki , a nie czystych współrzędnych Mavena, i dodatkowo zewnętrznie podać numer wersji we właściwości:

Rodzic 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>

Dziecko 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>

Użyłem tej sztuczki przez jakiś czas w jednym z moich projektów, bez żadnego konkretnego problemu, z wyjątkiem faktu, że maven rejestruje wiele ostrzeżeń na początku budowy, co nie jest bardzo eleganckie.

Edytuj

Wygląda na to, że maven 3.0.4 nie pozwala już na taką konfigurację.

 77
Author: Yanflea,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-13 15:51:35

Najprostszy sposób aktualizacji wersji IMO:

$ mvn versions:set -DgenerateBackupPoms=false

(Zrób to w folderze root/parent pom).

Twoje POMs są analizowane i jesteś pytany, którą wersję ustawić.

 63
Author: pai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-12 14:27:16

Możesz również użyć:

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

Aby zaktualizować numery wersji w swoich POMs.

 16
Author: Jerry Jin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-12 14:22:40

Jak wspomniał Yanflea, jest sposób, aby to obejść.

In Maven 3.5.0 możesz użyć następującego sposobu przeniesienia wersji z projektu nadrzędnego:

Rodzic Pom.xml

<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>

Moduł 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>

Możesz zmienić myversion na cokolwiek chcesz, to nie jest zastrzeżona własność.

 12
Author: eFox,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-16 11:05:00

Od wersji Maven 3.5.0 można do tego używać symbolu zastępczego ${revision}. Użycie jest udokumentowane tutaj: Maven Ci Friendly Versions .

W skrócie rodzic pom wygląda tak (cytowany z Dokumentacji 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>

I dziecko pom jak to

<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>

Również musisz użyć Flatten Maven plugin do generowania dokumentów pom z dedykowanym numerem wersji dołączonym do wdrożenia. HowTo jest udokumentowane w linkowanych dokumentacja.

Również @khmarbaise napisał fajny Post blob o tej funkcji: Maven: pliki POM bez wersji w nim?

 2
Author: FrVaBe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-23 08:29:44

Odpowiedź EFox działała dla pojedynczego projektu, ale nie wtedy, gdy odwoływałem się do modułu z innego (pom.xml były nadal przechowywane w moim {[1] } z właściwością zamiast wersji).

Działa jednak, jeśli połączysz go z flatten-maven-plugin, ponieważ generuje poms z poprawną wersją, a nie właściwością.

Jedyną opcją, którą zmieniłem w definicji wtyczki jest outputDirectory, domyślnie jest pusta, ale wolę ją mieć w target, która jest ustawiona w moim .gitignore konfiguracja:

<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>

Konfiguracja wtyczki wchodzi do macierzystego pom .xml

 1
Author: LeoLozes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-26 15:06:26