Maven proje sürümü devralma - ana sürümü belirtmem gerekiyor mu?


189

İki projem var: Ana proje: A, Alt proje: B

A / pom.xml:

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

Ve B / pom.xml'de var:

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

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

Ben koymak gerekir benim durumumda tek yer bu yüzden, B ebeveynden sürümünü devralmak istediğiniz 0.1-SNAPSHOTolduğu A/pom.xml. İ kaldırmak Ama eğer <version>0.1-SNAPSHOT</version>gelen B/pom.xmlüst bölümünün altında maven ebeveyn için eksik sürümü hakkında şikayet ediyor.

Her iki pomada da ${project.version}kaçınmak için kullanabileceğim bir yol ya da bunun gibi bir şey var 01.-SNAPSHOTmı?


4
Bunun için Maven 3.1'i beklemeniz gerekecek, korkarım.
Algılama



1
Yukarıdaki bağlantı taşındı. Nihai statü "Kapalı / Fix olmaz" idi issues.apache.org/jira/browse/MNG-624
jocull

Yanıtlar:


86

EDIT: Maven 3.5.0 beri ${revision}yer tutucu kullanarak bunun için güzel bir çözüm var . Ayrıntılar için FrVaBe'nin cevabına bakınız. Önceki Maven sürümleri için orijinal cevabımı aşağıya bakın.


Hayır, yok. Her zaman ebeveynin sürümünü belirtmeniz gerekir. Neyse ki, çoğu durumda arzu edilen şey modülün versiyonu olarak miras alınır. Dahası, bu ebeveynin sürüm bildirimi Maven Release Plugin tarafından otomatik olarak çarpılır, bu nedenle - aslında - sürümleri serbest bırakmak veya sadece çarpmak için Maven Release Plugin'i kullandığınız sürece 2 yerde sürümünüz olması bir sorun değildir.

Bu davranışın gerçekten iyi olduğu ve ihtiyacınız olabilecek daha fazla esneklik sağladığı bazı durumlar olduğuna dikkat edin. Bazen miras almak için önceki ebeveynin bazı versiyonlarını kullanmak istersiniz, ancak bu ana akım bir durum değildir.


3
Artık bunun için ${revision}yer tutucuyu kullanabilirsiniz . Cevabımı görün ;-)
FrVaBe

2
Bu güncel değil - @ FrVaBe'nin cevabını buradan kontrol edin: stackoverflow.com/a/51969067/514483
robd

@FrVaBe, farklı sürümleri olan ebeveynleri iç içe koyarsak ne olur? Orada bir $ {revision} mülk kullanamıyoruz, bu yeterli değil.
halil

@halil Soru, iki eserde aynı sürüme sahip olmak amacıyla bir sürümü üst öğeden devralmakla ilgilidir. Farklı sürümlere (miras hiyerarşisinde) sahip farklı ebeveynleriniz varsa, muhtemelen bunları aynı sürüm yapmazsınız. Bu nedenle yorumu tam olarak anlamıyorum.
FrVaBe

86

Maven bu şekilde çalışmak için tasarlanmamıştır, ancak bu hedefe ulaşmak için bir geçici çözüm vardır (belki yan etkilerle, bir deneme yapmanız gerekecektir). İşin püf noktası, çocuk projesine ana maven koordinatları yerine göreli yolunu kullanarak ebeveynini bulmasını ve bir mülkteki sürüm numarasını harici hale getirmesini söylemektir :

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

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

Bu hileyi bir süredir projemden biri için kullandım, maven'in yapının başlangıcında çok zarif olmayan birçok uyarıyı günlüğe kaydetmesi dışında belirli bir sorun yok.

DÜZENLE

Maaven 3.0.4 artık böyle bir yapılandırmaya izin vermiyor gibi görünüyor.


2
evet, korkarım maven bu şekilde çalışmak için tasarlanmamıştır, daha iyi versiyonları alt pom.xml'ye koyarak yapıştırın. maven yayın eklentisi zaten orada sürümleri umurumda değil.
Shengjie

7
3.0.5 için çalışır tamam. yine de <properties> yazmalısınız.
ses

7
3.2.3'te çalışır. <Mülklerin> yeri önemli değildir. Yine de bir uyarı alacaksınız:'version' contains an expression but should be a constant.
kapex

4
Lütfen, buna dikkat et. Projenize başka bir proje tarafından referans verildiğinde bu işe yaramaz. Mülk çözülmeyecek ve tam anlamıyla ele alınacaktır (yani $ {my.version}). Bu, bağımlılıkları çözerken başarısızlığa neden olacaktır.
spekdrum

2
Bunu bir süredir kullanıyorum ve tek bir çoklu modül projesi için gayet iyi çalışıyor (şu anda maven 3.3.9 ile). Ancak, projeniz başka bir projeye bağımlı hale gelir gelmez işler gerçekten zorlaşır. Gerçekten @pay tarafından önerilen öneriyi kabul etmenizi öneririm.
ustaca

81

IMO sürümlerini güncellemenin en kolay yolu:

$ mvn versions:set -DgenerateBackupPoms=false

(bunu root / parent pom klasörünüzde yapın).

POM'larınız ayrıştırılır ve hangi sürümü ayarlamanız istenir.


17
Etkileşimli olarak girilmesini önlemek için -DnewVersion = {versionToBeUpdated} öğesini de ekleyebilirsiniz.
Mukesh

1
Bu en iyi cevap olduğunu düşünüyorum, alt projeleri kırmadan (ki ana pom olmadan referans olamazdı) sürüm değişikliklerini otomatik hale getirir.
Tarek

Evet! İşte cevap. 🙌
aaiezza

Alt ve üst pom sürümü başlangıçta farklıysa, önce bunları eşleştirmek için güncelleyin, mvn versions:update-child-modules aksi takdirde tüm alt modül pom sürümü atlanır.
Gautam Tadigoppula

75

Maven 3.5.0'dan beri ${revision}bunun için yer tutucuyu kullanabilirsiniz . Kullanım burada belgelenmiştir: Maven CI Friendly Versions .

Kısacası, ana pom şöyle görünür (Apache belgelerinden alıntılanmıştır):

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

ve çocuk pom böyle

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

Ayrıca , dağıtım için verilen özel sürüm numarasıyla pom belgeleri oluşturmak için Flatten Maven Eklentisini kullanmanız gerekir . HowTo, bağlantılı belgelerde belgelenmiştir.

Ayrıca @khmarbaise bu özellik hakkında güzel bir blob yazısı yazdı: Maven: İçinde Sürüm Olmadan POM Dosyaları?


Projemi tarif ettiğiniz gibi yapılandırdım, ancak "Maven Eklentisini Düzleştir" olmadan ve beklendiği gibi çalışıyor gibi görünüyor, bu mümkün mü? Ayrıca maven 3.2.1 ile ilgili bir hata aldım, ancak maven 3.3.9+ iyi çalışıyor gibi görünüyor.
Max

@Max "Beklendiği gibi çalış" olarak tanımladığınız şeye bağlıdır. Sanırım yapı geçecek ama bir depoya yükleme / dağıtma muhtemelen iyi bir fikir olmayacaktır çünkü çocuk
pomunda

Üst özellik ile <version> $ {revision} </version> kullanıyorum (<properties> <version> 0.1-default </version> </properties>. Çocuk pomsları da <version> $ {revision} < / version>. "mvn clean install -Drevision = 0.1. $ {bamboo.buildNumber}" kullanıyorum. Dağıtım günlüklerini taradığımda her şey 0.1.820 olarak ayarlandı ve günlüklerde 0.1 varsayılanı bile yok (820 Ortaya çıkan kavanozu taradığımda manifest'te "Uygulama-Sürüm: 0.1.820" ve bir pom.properties dosyasında "version = 0.1.820" ifadesini görüyorum. $ {revision} </version>. Sanırım sorun değil mi?
Max

1
@ Max Sürümün ${revision} başka bir projeye bağımlılık olarak pom'daki (maven deposunda) olduğu bir kavanozu çözmeye çalışın . Bunun işe yarayacağını sanmıyorum.
FrVaBe

Bu, bir sürüm yaptığım sürece faydalıdır. Bu ${revision}, sürüm etiketinde yeni sürümle yer değiştiriyor
Mike D

21

Yanflea'nın belirttiği gibi, bunun etrafından dolaşmanın bir yolu var.

Maven 3.5.0'da sürümü üst projeden aktarmanın aşağıdaki yolunu kullanabilirsiniz:

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

POM.xml Modülü

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

myversionAyrılmış bir mülk olmayan her şeyi değiştirmekte özgürsünüz .


3
Başka bir projeden bir modüle başvururken, Maven özelliği çözmez. Bu normal mi?
LeoLozes

Sorunun kendi girişine layık olabileceğine ve böyle bir yorumda olmayabileceğine inanıyorum. Kodunuzu görmeden sadece çılgınca tahmin edebilirim.
eFox

@LeoLozes Sorununuzu çözdünüz mü (başka bir projeden referans modülü)?
Morteza Malvandi

@MortezaMalvandi evet! Cevabım en altta :)
LeoLozes

2
Maven 3.6.0 bu yapılandırma için uyarı verir: "Yapınızın kararlılığını tehdit ettikleri için bu sorunları düzeltmeniz önemle tavsiye edilir." "Bu nedenle, gelecekteki Maven sürümleri artık bu tür hatalı biçimlendirilmiş projelerin oluşturulmasını desteklemeyebilir."
d2k2

18

Ayrıca şunları kullanabilirsiniz:

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

POM'larınızdaki sürüm numaralarını güncellemek için.


10

eFox'un cevabı tek bir proje için çalıştı, ancak başka bir modülden bir modüle atıfta bulunduğumda değil (pom.xml hala .m2sürüm yerine özellikte saklandı ).

Ancak, flatten-maven-pluginpompayı özelliği ile değil, doğru sürümle ürettiği için ile birleştirirseniz çalışır .

Eklenti tanımında değiştirdiğim tek seçenek outputDirectoryvarsayılan olarak boş, ancak yapılandırmamda targetayarlanmış olanı tercih ettim .gitignore:

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

Eklenti yapılandırması üst pom.xml dosyasına gider



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>

Yani B'nin pomunun üst bloğundan sürümü kaldırmak istediğinizi düşünüyorum, bunu yapamazsınız, groupId, artifactId ve sürüm ebeveynin pom koordinatlarını belirledi, atlayabileceğiniz şey çocuk sürümü.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.