Çoklu modül projesinde Maven testi bağımlılığı


86

Çoklu modül projesi oluşturmak için maven kullanıyorum. Modül 2, derleme kapsamındaki Modül 1 src'ye ve test kapsamındaki modül 1 testlerine bağlıdır.

Modül 2 -

   <dependency>
       <groupId>blah</groupId>
       <artifactId>MODULE1</artifactId>
       <version>blah</version>
       <classifier>tests</classifier>
       <scope>test</scope>
   </dependency>

Bu iyi çalışıyor. Modül 3'ün Module1 src'ye bağlı olduğunu ve derleme zamanında test edildiğini varsayalım.

Modül 3 -

   <dependency>
       <groupId>blah</groupId>
       <artifactId>MODULE1</artifactId>
       <version>blah</version>
       <classifier>tests</classifier>
       <scope>compile</scope>
   </dependency>

Çalıştırdığımda mvn clean install, yapım modül 3'e kadar çalışıyor, modül 1 test bağımlılığını çözemediği için modül 3'te başarısız oluyor. Sonra mvn installtek başına bir modül 3 yapıyorum , geri dönüyorum ve mvn installonu inşa etmek için ebeveyn pomuma koşuyorum . Bunu nasıl düzeltebilirim?


Lütfen anne babanızın neye benzediğini paylaşır mısınız?
Chris Gummer

Yanıtlar:


128

Ne yapmaya çalıştığınıza dair bir şüphem var, ancak bir proje (modül1) için oluşturduğunuz testleri başka bir projede yeniden kullanmak istediğinizi varsayacağım. Kılavuzun altındaki ekli testleri kullanma notunda açıklandığı gibi :

Bu kılavuzun önceki sürümlerinin <classifier>tests</classifier>yerine kullanılması önerildiğini unutmayın <type>test-jar</type>. Bu şu anda bazı durumlarda işe yarasa da, test JAR modülünün reaktör yapımı sırasında ve kurulumdan önce bir yaşam döngüsü aşaması başlatılırsa herhangi bir tüketici düzgün çalışmaz. Böyle bir senaryoda Maven, test JAR'ı reaktör yapısının çıktısından değil, yerel / uzak depodan çözecektir. Görünüşe göre, havuzlardaki JAR güncelliğini yitirmiş veya tamamen eksik olabilir ve bu da bir yapı hatasına neden olabilir (cf. MNG-2045 ).

Bu nedenle, önce bir JAR'da derlenmiş testleri paketlemek ve bunları genel yeniden kullanım için dağıtmak için maven-jar-pluginaşağıdaki gibi yapılandırın :

<project>
  <build>
    <plugins>
     <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-jar-plugin</artifactId>
       <version>2.2</version>
       <executions>
         <execution>
           <goals>
             <goal>test-jar</goal>
           </goals>
         </execution>
       </executions>
     </plugin>
    </plugins>
  </build>
</project>

Ardından, test JAR yapısını her zamanki gibi kurun / dağıtın ( mvn installveyamvn deploy ).

Son olarak, test JAR'ı kullanmak için, belirtilen türde bir bağımlılık belirtmelisiniz test-jar:

<project>
  ...
  <dependencies>
    <dependency>
      <groupId>com.myco.app</groupId>
      <artifactId>foo</artifactId>
      <version>1.0-SNAPSHOT</version>
      <type>test-jar</type>
      <scope>test</scope>
    </dependency>
  </dependencies>
  ...
</project>

3
Pascal. Öncelikle tüm maven sorularını yanıtladığınız için çok teşekkürler !! Bu soruyla ilgili olarak. Hala bir sorunum var. Tüm alt nesnelerde kullanmak istediğim çekirdek modüllerimden birinde bazı testBase sınıfım var. CI'mızda maven inşa ettik. Test kavanozuna herhangi bir dağıtım kurulumu yapmak istemiyorsam ve sadece bagajdan yeni bir kopya kontrol etmek ve mvn testini çalıştırmak için. Henüz hiçbir yerde test kavanozum olmadığından bu başarısız oluyor. Bununla nasıl başa çıkılacağına dair bir fikrin var mı?
Roman

@Roman Running kurulumu "doğal" yoldur. Ancak bir çözüm bulmuşsunuz gibi görünüyor.
Pascal Thivent

Görünüşe göre bu sorun 2045 değil 3559, bu noktada sorun: jira.codehaus.org/browse/MNG-3559
HDave

Bu neler olduğunu açıklasa da bir çözüm sağlamaz. Sadece OP'nin (ve örneğin I) halihazırda yapmakta olduğu şeyi yapmayı önerir.
Antoniossss

19

Pascals sorusuna yaptığım yorumla ilgili olarak, tutarlı bir cevap bulduğumu düşünüyorum:

<plugins>
    <plugin>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.2</version>
        <executions>
            <execution>
            <goals>
                <goal>test-jar</goal>
            </goals>
            <phase>test-compile</phase>
        </execution>
        </executions>
        <configuration>
            <outputDirectory>${basedir}\target</outputDirectory>
        </configuration>
    </plugin>
</plugins>

Burada gördüğünüz gibi buradaki temel fark, <phase> etikettir.

Test kavanozunu oluşturacağım ve sadece paket aşamasından sonra değil, testlerin derleme aşamasında da mevcut olacak.

Benim için çalışıyor.


1
Evet, çok uygun. Paylaşım için teşekkürler. Sanırım dağıtım yaklaşımı yalnızca kurumsal bir dizininiz olduğunda daha iyidir (evet, bunun şiddetle tavsiye edildiğini biliyorum). Teşekkürler @Roman
Damien

2

As https://maven.apache.org/plugins/maven-jar-plugin/examples/create-test-jar.html diyor ki:

Test sınıfları içeren bir jar nasıl oluşturulur Test sınıfları içeren bir jar oluşturmak istediğinizde, muhtemelen bu sınıfları yeniden kullanmak isteyeceksiniz. Bunu çözmenin iki yolu vardır:

  1. The easy way Mevcut projedeki test sınıflarıyla ekli bir jar oluşturun ve geçişli test kapsamlı bağımlılıklarını gevşetin.

  2. The preferred way Test sınıflarıyla ayrı bir proje oluşturun.

Lütfen ayrıntı için bu makaleyi okuyun.

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.