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?
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.
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ę.
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ć.
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.
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ść.
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?
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
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