2011-08-28 22 views
17

modelinin arketipinin çıktığı projeye bağımlılık katacak bir proje iskeleti oluşturan bir Maven arketipi oluşturuyorum.Maven arketipinde archetype proje sürümü nasıl eklenir?

<dependencies> 
    <dependency> 
    <groupId>com.foo</groupId> 
    <artifactId>origin-core</artifactId> 
    <version>SOMEVERSION</code> 
    </dependency> 
</dependencies> 

Ben SOMEVERSION olmak istiyorum:

origin/archetype/... archetype for generating project 
     /core/... core services 
     /extra/... extra services 

ve arketip şöyle bağımlılıklarını içeren bir POM bir projeyi oluşturur: gibi

Örneğin, köken proje görünüyor orijin projesinin zamanındaki versiyonu, arketipin depoda oluşturulduğu ve yükleneceği zaman. köken proje sürüm 1.0-SNAPSHOT olan ve mvn install ed ise

Yani, o zaman arketip origin-core 1.0-SNAPSHOT bir bağımlılık oluşturmak istiyorum. Kökeni çıkarıp ve otomatik olarak sürüm 1.0'a çarptığında, arketipin origin-core 1.0 üzerinde bir bağımlılık oluşturmasını istiyorum.

Temel olarak POM türünde bir Velocity değişken olarak ${archetypeVersion} kullanmak istiyorum, ancak bu mümkün görünmüyor.

Burada yapmaya çalıştığım şeyi gerçekleştirmenin başka bir yolu var mı?

cevap

32

Yukarıdaki soruyu birkaç gün önce Maven e-posta listesine sordum ve tumbleweeds var. Neyse ki, sonunda kendi başıma buldum. İşte bunu gerçekleştirmek için en az bir akıl yolu yolu:

Arkaplanı oluştururken geçerli proje sürümünün yerine geçmek için src/main/resources/archetype-resources/pom.xml dosyanızdaki Maven filtrelemesini kullanın. İşte

o işler böyle yürüyor: En arketip dosyaları doğal olarak ${variable} olacak çünkü

archetype-resources/pom.xml dosya üzerinde değil, başka bir şey filtreleme etkinleştirmek için archetype/pom.xml dosyasını değiştirme (biryere s ve o istemiyoruz Oluşturma zamanında ikame edilecek, arketip oluşturulduğunda bunların yerine konulmasını istiyorsunuz).

<pluginManagement> 
    <plugins> 
    ... 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-resources-plugin</artifactId> 
     <version>2.5</version> 
     <configuration> 
     <escapeString>\</escapeString> 
     </configuration> 
    </plugin> 
    </plugins> 
</pluginManagement> 
: Filtreleme sırasında onlar prototip oluşturma zamanında ikame edilebilmesi için olduğu gibi kalması gerekir sizin arketip pom tüm değişkenleri kaçabilmesi için

<resources> 
    <resource> 
    <directory>src/main/resources</directory> 
    <filtering>true</filtering> 
    <includes> 
     <include>archetype-resources/pom.xml</include> 
    </includes> 
    </resource> 
    <resource> 
    <directory>src/main/resources</directory> 
    <filtering>false</filtering> 
    <excludes> 
     <exclude>archetype-resources/pom.xml</exclude> 
    </excludes> 
    </resource> 
</resources> 

, kullanım için bir kaçış karakteri etkinleştirme

(Not <resources> ve <pluginManagement> öğeleri yukarıda gösterilen POM'nuzun <build> öğesinin içine yerleştirilmelidir.)

Eğer prototip proje versiyonu eklenecek istiyorum ve prototip zaman nesil saatine kadar değiştirilmemiş kalması gerektiğini diğer değişkenlerin tüm kaçış için arketip pom, kullan ${project.version}:

<?xml version="1.0" encoding="UTF-8"?> 
<project ...> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>\${groupId}</groupId> 
    <artifactId>\${artifactId}</artifactId> 
    <version>\${version}</version> 
    <packaging>jar</packaging> 

    <dependencies> 
    <dependency> 
     <groupId>com.foo</groupId> 
     <artifactId>origin-core</artifactId> 
     <version>${project.version}</version> 
    </dependency> 
    </dependencies> 

</project> 
+0

Tam olarak ihtiyacım olan şey. Çok teşekkürler. –

+0

Bir çekicilik gibi çalışır! Teşekkürler. – Malvin

+0

Bu çok tatlı, mükemmel mesaj. – ocarlsen

12

alternatif Bu yüzden böyle yapılır

kabul edilen yanıt çözüm archetype's descriptor/metadata dosyasında varsayılan bir özellik filtre etmektir:

sadece filtreleme maven bu dosyayı filtreler:

<resources> 
<resource> 
    <directory>src/main/resources</directory> 
    <filtering>true</filtering> 
    <includes> 
     <include>META-INF/maven/archetype-metadata.xml</include> 
    </includes> 
</resource> 
<resource> 
    <directory>src/main/resources</directory> 
    <filtering>false</filtering> 
    <excludes> 
     <exclude>META-INF/maven/archetype-metadata.xml</exclude> 
    </excludes> 
</resource> 
</resources> 

arketip meta veri dosyası:

<?xml version="1.0" encoding="UTF-8"?> 
<project ...> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>${groupId}</groupId> 
    <artifactId>${artifactId}</artifactId> 
    <version>${version}</version> 
    <packaging>jar</packaging> 

    <dependencies> 
    <dependency> 
     <groupId>com.foo</groupId> 
     <artifactId>origin-core</artifactId> 
     <version>${projectVersion}</version> 
    </dependency> 
    </dependencies> 

</project> 
:

<archetype-descriptor ...> 
    <requiredProperties> 
     <requiredProperty key="projectVersion"> 
      <defaultValue>${project.version}</defaultValue> 
     </requiredProperty> 
    </requiredProperties> 

    ... 
</archetype-descriptor> 

ve prototip zaman en POM proje versiyonu olarak projectVersion gerekli özellik değerini kullanmak istiyorsunuz dışında daha önce benzer olacağını

Bu yaklaşım, modelin POM'sindeki tüm özellik değerlerinden ve onunla birlikte gelen kaynak eklenti yapılandırmasından kurtulmaktan kaçınması avantajına sahiptir. . Şahsen, tüm bu oldukça çirkin ve hata eğilimli buluyorum.

Bu, arketip oluşturulurken kullanıcının proje sürümünü onaylaması veya değiştirmesi istenmesi anlamına gelir. Senaryoya göre, sanırım bu iyi ya da kötü bir şey olarak düşünülebilir.

+0

Bu çözüm kesinlikle kabul edilen olandan daha iyidir. Bunun için çok teşekkür ederim. Zamanımın birçoğunu kaydeder –

-1

Çok aptalca bir şey denedim ve işe yaramış görünüyor. Benim META-INF/maven/Arketip-metadata.xml dosyasına aşağıdaki eklendi:

<requiredProperties> 
    <requiredProperty key="archetypeVersion"> </requiredProperty> 
</requiredProperties> 

Bunu varsayılan olarak bunu bilirdik düşünürdüm ama o kadar bu kullanmak için bunu hatırlatmak görünüyor gelmez . Belki de maven'deki bir böcek yüzünden.

+0

Etkileşimli mod kullanıyorsanız ve arketip test kaynaklarını filtrelemeniz gerekiyorsa işe yaramaz. İsteğe bağlı olarak işi yapmak için @PhilMander cevabına güvenebilirsiniz. – LoganMzz

İlgili konular