Maven WAR bağımlılığı


82

Kabul testi için bir proje yazıyorum ve çeşitli nedenlerden dolayı bu, SAVAŞ olarak paketlenmiş başka bir projeye bağlı. Ben maven-bağımlılık-eklentisi kullanarak WAR paketten başarmış ama çözdükten içerecek şekilde projemi alamayan WEB-INF/lib/*.jarve WEB-INF/classes/*yapı başarısız böylece üzerinde sınıf dahil edilecek. Bu dosyaları sınıf yoluna dahil etmenin bir yolu var mı, yoksa bir SAVAŞ'a bağlı olmanın daha iyi bir yolu var mı?

Çok teşekkürler.

Yanıtlar:


116

Maven-war-plugin 2.1-alpha-2'den beri başka bir seçenek var. WAR projenizde:

<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <version>2.1.1</version>
    <configuration>
        <attachClasses>true</attachClasses>
    </configuration>
</plugin>

Bu, aşağıdakilerle birlikte kabul testleri projesinde kullanabileceğiniz bir sınıf eseri oluşturur:

<dependency>
    <groupId>your-group-id</groupId>
    <artifactId>your-artifact-id</artifactId>
    <version>your-version</version>
    <classifier>classes</classifier>
</dependency>

6
Benim için bununla ilgili tek sorun, geçişli bağımlılıkları
çekmemesi

1
Evet, bu ipucu için teşekkürler :) Benim için kısmen çalıştı. Maven komut satırı ile her şey yolunda. Tutulmada maven (m2e) ile savaştaki sınıfları referans alan testlerin oluşturulması da sorun değil, ancak testleri çalıştırmaya çalıştığımda (junit) bunun çalışması için m2e çalışma alanı çözünürlüğünü kapatmam gerekiyor. Aksi takdirde junit çalıştırması, savaşın başvurulan sınıfları için bir ClassNotFoundException oluşturur. Savaş projesi, projenin derleme yolundaki maven bağımlılıkları kitaplığı altında listelenmesine rağmen, bir şekilde bunlar junit yürütme sınıf yolunda dahil edilmemiştir. Herhangi bir fikir?
Gandalf

1
Geçişli bağımlılıklar elde etmek için bağımlılığın pom'unu projenin bağımlılığı olarak ekleyebilirsiniz. Böylece sınıflara ve ponponlara bağımlı olursunuz
Jonatan Cloutier

Lütfen bu eklentinin pom'un <build> ayarlarına gitmesi gerektiğini unutmayın.
MichaelCleverly

Benim durumumda src / main / resources / * dosyasına ihtiyacım vardı ve bunlar da "-class.jar" dosyasında yer alıyor - harika!
Jonas Berlin

24

Aslında, tasarım gereği Maven, bir projenin bağımlılığı olarak ilan edilen bir savaşın geçişli bağımlılıklarını çözmez. Orada bu konuda bir sorun, aslında MNG-1991 , ancak Maven 2.x içinde çözülemeyeceği ve ben emin değilim bindirmeleri Bu sorunu gidermek için izin verirse bilmiyorum. Önerilen çözüme dair anlayışım, örneğin pom tipi bir projede bağımlılıkları çoğaltmaktır.


(DÜZENLEME: Biraz daha kazı yaptıktan sonra, bu başlıkta aşağıda alıntı yaptığım ilginç bir şey buldum :

Maven savaş eklentisindeki savaş kaplaması özelliğini yoğun bir şekilde kullandığımız geçen ay AppFuse projesinin geliştirilmesine yardımcı oluyorum. Gerçekten şık bir özellik!

Savaş katmanlarıyla maksimum güç elde etmek için, projelerin savaş eserlerini tam anlamıyla bağımlılıklar olarak kullanmasına izin veren Warpath eklentisini geliştirdim. Kısaca:

1) Savaş bağımlılığı yapılarındaki / WEB-INF / classes dizininin içeriği, normal derleme, vb. Görevler için projenin sınıf yoluna dahil edilebilir.
2) Savaş bağımlılığı eserlerinden geçici bağımlılıklar, diğer eklentiler tarafından kullanılabilir hale gelir, örneğin derleme ve kulak - bu nedenle, sıska savaşlar oluştururken tüm bağımlılıkları dahil etmek zorunda kalmayacaksınız!

Eklenti şimdi son birkaç aydır AppFuse projesinde aktif olarak kullanılıyor ve hem kullanılabilir hem de kararlı olduğu bir noktada olduğunu hissediyorum. Savaş eklentisi ekibi, savaş eklentisinin içine warpath işlevselliğini dahil etmekle ilgilenir mi? Onu barındırmak için en doğal yer gibi görünüyor.

Yani, onunla herhangi bir deneyimim yok, ancak maven warpath eklentisi aslında güzel ve basit görünüyor ve merkezi depoda mevcut. Kullanmak için pom.xmldosyanıza aşağıdaki eklenti yapılandırma öğesini ekleyin :

[...]
<build>
  <plugins>
    <plugin>
      <groupId>org.appfuse</groupId>
      <artifactId>maven-warpath-plugin</artifactId>
      <version>1.0-SNAPSHOT</version>
      <extensions>true</extensions>
      <executions>
        <execution>
          <goals>
            <goal>add-classes</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>
[...]

Ve sınıf yoluna dahil edilmesini istediğiniz savaş bağımlılıklarını, warpath türü bağımlılıkları olarak ekleyin :

[...]
<dependencies>
  <dependency>
    <groupId>org.appfuse</groupId>
    <artifactId>appfuse-web</artifactId>
    <version>2.0</version>
    <type>war</type>
  </dependency>
  <dependency>
    <groupId>org.appfuse</groupId>
    <artifactId>appfuse-web</artifactId>
    <version>2.0</version>
    <type>warpath</type>
  </dependency>
</dependencies>
[...]

Hem savaş hem de savaş yolu bağımlılık türlerine ihtiyaç vardır: savaş türü, savaş katmanını yapmak için Maven savaş eklentisi tarafından kullanılır, savaş yolu türü, proje sınıf yoluna dahil edilecek doğru yapay nesneler listesini belirlemek için Warpath eklentisi tarafından kullanılır.

Bir denerdim.)


1
Pascal, projemde farklı sunucularda entegrasyon testi çalıştırmak için ayrı modüllerim var (her modül bir sunucu için). Bu test modüllerinin test sınıfları vardır ve savaş bağımlılığı ve katmanları kullanır. Harika çalışıyorum
cetnar

Yazdığım gibi emin değildim, bu yüzden geri bildirim için teşekkürler, bilmek güzel. Sadece savaşın java sınıflarıyla değil, bir savaşın geçişli bağımlılıkları ile çalıştığını doğrulayabilir misiniz?
Pascal Thivent

Tamam teşekkürler. Şimdi nasıl çalıştığını anlıyorum (önemli olan 2. cümleniz: test projenizde de ambalaj savaşı olmalı ).
Pascal Thivent

1
Bu eklentiyle ilgili sorunum m2eclipse tarafından desteklenmemesi: maven.40175.n5.nabble.com/…
milan

Bu eklenti aynı zamanda hem Maven yayınını hem de montaj eklentilerini bozar çünkü bunların her ikisi de warpath eklentisini kullanan bir WAR'ın bağımlılıklarını çözmeye çalışacaktır, Maven, type = warpath bağımlılığını çözemeyeceğini söyleyerek bozar. Ne yazık ki işe yaramıyor.
HDave

14

Bindirmeleri kullanın . İlk olarak, test projenizin de ambalajı olması gerekir war.

Test etmek istediğiniz savaş projesinin bağımlılığını beyan edin:

<dependency>
    <groupId>${project.groupId}</groupId>
    <artifactId>your-project-arftifactId</artifactId>
    <version>${project.version}</version>  
    <type>war</type>
    <scope>test</scope>
</dependency>

ardından maven-war-eklenti kaplamasını yapılandırın:

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <configuration>
            <webResources>
                <resource>
                    <directory>${basedir}/src/main/webresources</directory>
                    <filtering>true</filtering>
                </resource>
            </webResources>
            <overlays>
                <overlay/>
                <overlay>
                    <groupId>your.group</groupId>
                    <artifactId>your-project-artifactId</artifactId>
                </overlay>
            </overlays>
        </configuration>
    </plugin>

Test projesindeki yukarıdaki örnekte, web kaynakları yapılandırma dosyalarının (bağlam metni vb.) Üzerine yazıyorum.

DÜZENLEME: Bu çözüm Maven 3 ile test edilmedi.


1
Bunu test etmeden önce oy verdim. Bunun Maven3'ü kullandığım için mi olduğunu bilmiyorum, ama aslında hem / sınıflarım hem de / lib klasörlerim birden fazla WAR bağımlılığı aracılığıyla geçişli olarak dahil ediliyor. Tekrar - oy verdiğim için özür dilerim. Görünüşe göre bu "doğru" cevap.
HDave

4

İyi nokta Justin. Bu, aslında benim problemimi çözmemi sağladı, yani: bir meclise bir savaş dahil etmek VE tüm geçişli bağımlılıkları dahil. Derleme eklentisi o groupId / artefactId tarafından referans verilen bir kavanoz bulamayacağından, önerdiğiniz gibi savaş bağımlılığını 'jar' olarak kopyalayamadım, ancak

  • savaş bağımlılığını pom türü olarak çoğaltmak

İşler! Savaş ve onun geçici bağımlılıkları meclise dahil edilmemiştir. (Şimdi de görünen) pom dosyasını dışlamak için, bunun gibi bir dışlama öğesi eklemem gerekiyordu:

  <excludes>
    <exclude>*:pom</exclude>
  </excludes>

assembly.xml dosyama.

Sanırım bu, bu konudaki orijinal soru için bir geçici çözüm olabilir.


-1

Savaş projesine olan bağımlılığı bir kavanoz bağımlılığı olarak listelerseniz, gerekli kavanozları / kaynakları alıyor gibi görünüyor. Maven 2.2 + m2eclipse kullanıyorum.

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.