Ketergantungan uji Maven dalam proyek multi modul

86

Saya menggunakan maven untuk membangun proyek multi modul. Modul 2 saya bergantung pada src Modul 1 di ruang lingkup kompilasi dan pengujian modul 1 dalam lingkup pengujian.

Modul 2 -

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

Ini bekerja dengan baik. Katakanlah modul saya 3 bergantung pada src Module1 dan tes pada waktu kompilasi.

Modul 3 -

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

Ketika saya menjalankan mvn clean install, build saya berjalan hingga modul 3, gagal di modul 3 karena tidak dapat menyelesaikan ketergantungan uji modul 1. Kemudian saya melakukan mvn installdi modul 3 sendiri, kembali dan menjalankan mvn installpom orang tua saya untuk membuatnya. Bagaimana cara memperbaikinya?

pengguna209947
sumber
Bisakah Anda membagikan seperti apa tampilan pom orang tua Anda?
Chris Gummer

Jawaban:

128

Saya ragu tentang apa yang Anda coba lakukan, tetapi saya akan menganggap Anda ingin menggunakan kembali tes yang telah Anda buat untuk proyek (module1) di proyek lain. Seperti yang dijelaskan dalam catatan di bagian bawah Panduan untuk menggunakan tes terlampir :

Perhatikan bahwa edisi sebelumnya dari panduan ini disarankan untuk digunakan <classifier>tests</classifier>sebagai pengganti <type>test-jar</type>. Meskipun saat ini berfungsi untuk beberapa kasus, ini tidak berfungsi dengan baik selama pembuatan reaktor modul JAR pengujian dan konsumen mana pun jika fase siklus hidup sebelum penginstalan dipanggil. Dalam skenario seperti itu, Maven tidak akan menyelesaikan tes JAR dari output build reactor tetapi dari repositori lokal / jarak jauh. Rupanya, JAR dari repositori mungkin sudah ketinggalan zaman atau benar-benar hilang, menyebabkan kegagalan build (lihat MNG-2045 ).

Jadi, pertama-tama, untuk mengemas pengujian terkompilasi dalam JAR dan menerapkannya untuk digunakan kembali secara umum, konfigurasikan maven-jar-pluginberikut ini:

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

Kemudian, instal / terapkan artefak JAR pengujian seperti biasa (menggunakan mvn installatau mvn deploy).

Terakhir, untuk menggunakan JAR pengujian, Anda harus menentukan dependensi dengan tipe yang ditentukan 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>
Pascal Thivent
sumber
3
Pascal. Pertama-tama, terima kasih banyak telah menjawab semua pertanyaan pakar !! Mengenai pertanyaan ini. Saya masih punya masalah. Saya memiliki beberapa kelas testBase di salah satu modul inti saya yang ingin saya gunakan di semua objek anak. Kami saat ini telah membangun pakar di CI kami. Jika saya tidak ingin melakukan penginstalan penerapan apa pun ke jar uji dan hanya untuk memeriksa salinan baru dari trunk dan menjalankan uji mvn. Ini gagal, karena saya belum memiliki test-jar di mana pun. Ada ide bagaimana mengatasinya?
Roman
@Roman Running install adalah cara "alami". Tapi sepertinya Anda menemukan solusi.
Pascal Thivent
Tampaknya masalah ini 3559 bukan 2045 yang ditahan pada saat ini: jira.codehaus.org/browse/MNG-3559
HDave
Meskipun ini menjelaskan apa yang terjadi, ini tidak memberikan solusi. Ini hanya menyarankan untuk melakukan apa yang sudah dilakukan OP (dan misalnya saya).
Antoniossss
19

Mengenai komentar saya untuk pertanyaan Pascals, saya pikir saya telah menemukan jawaban yang sesuai:

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

Perbedaan utama di sini seperti yang Anda lihat di sini adalah <phase>tagnya.

Saya akan membuat test-jar dan itu akan tersedia dalam fase kompilasi tes dan tidak hanya setelah fase paket.

Bekerja untuk saya.

Roma
sumber
1
Ya, sangat nyaman. Terima kasih telah berbagi. Saya kira pendekatan penerapan lebih baik hanya jika Anda memiliki direktori perusahaan (ya, saya tahu ini sangat disarankan). Terima kasih @Roman
Damien
2

Seperti yang dikatakan https://maven.apache.org/plugins/maven-jar-plugin/examples/create-test-jar.html :

Cara membuat jar yang berisi kelas uji Jika Anda ingin membuat toples yang berisi kelas uji, Anda mungkin ingin menggunakan kembali kelas tersebut. Ada dua cara untuk mengatasinya:

  1. The easy way Buat jar terlampir dengan kelas uji dari project saat ini dan lepas dependensi transitif cakupan uji.

  2. The preferred way Buat proyek terpisah dengan kelas uji.

Silakan baca artikel itu untuk detailnya.

Bodoh
sumber