Lewati submodule saat membangun Maven


160

Kami memiliki kebutuhan untuk dapat melewatkan submodule di lingkungan tertentu.

Modul yang dimaksud berisi tes integrasi dan membutuhkan waktu setengah jam untuk beroperasi. Jadi kami ingin memasukkannya ketika membangun di server CI, tetapi ketika pengembang membangun secara lokal (dan tes dijalankan), kami ingin melewati modul itu.

Apakah ada cara untuk melakukan ini dengan pengaturan profil? Saya telah melakukan beberapa googling dan melihat pertanyaan / jawaban lain di sini dan belum menemukan solusi yang baik.

Saya kira satu pilihan adalah menghapus submodule itu dari induk pom.xmlsepenuhnya, dan hanya menambahkan proyek lain di server CI kami untuk hanya membangun modul itu.

Saran?


Kenapa tidak Maven Way? Ini klaim yang benar-benar valid untuk saya.
MaDa

Hmm. Sekarang saya tidak dapat menemukan tempat-tempat di mana orang-orang tampaknya menentang ini ... jadi saya memperbarui pertanyaan awal saya untuk menghapus klaim saya bahwa ini sepertinya bukan "The Maven Way".
denishaskin

Jawaban:


149

Tentu, ini bisa dilakukan menggunakan profil. Anda dapat melakukan sesuatu seperti yang berikut ini di pom.xml induk Anda.

  ...
   <modules>
      <module>module1</module>
      <module>module2</module>  
      ...
  </modules>
  ...
  <profiles>
     <profile>
       <id>ci</id>
          <modules>
            <module>module1</module>
            <module>module2</module>
            ...
            <module>module-integration-test</module>
          </modules> 
      </profile>
  </profiles>
 ...

Di CI Anda, Anda akan menjalankan pakar dengan ciprofil, yaitumvn -P ci clean install


4
Jawaban yang sangat bagus! Saya tidak tahu mengapa saya kesulitan menemukan ini dari Maven docs. Satu saran yang akan saya buat adalah karena saya lebih suka tes integrasi dijalankan secara default, saya menambahkan activeByDefaultke profil itu, dan kemudian harus menambahkan profil kosong lainnya (misalnya skip-integration-tests) untuk dapat melewati mereka.
denishaskin

7
apakah ada cara untuk melakukan ini tanpa menduplikasi semua hal yang dibagikan?
JonnyRaa

7
Hati-hati, jika Anda menggunakan plugin maven-release-plugin maka akan muncul bahwa ia tidak memperbarui nomor versi submodul yang tersembunyi di balik saklar profil. Anda dapat memiliki sub-modul dengan nomor versi yang berbeda dengan proyek Anda yang lain ...
Ardesco

8
Sayangnya, menggunakan profil Anda tidak dapat mengecualikan modul yang disebutkan sebelumnya di bagian <modules> utama dari pom. The Jira issues.apache.org/jira/browse/MNG-5230 (dan struktur pom seluruh) bisa sepenuhnya-dilaksanakan jauh lebih baik dengan pemikiran sedikit lebih berhati-hati.
Ed Randall

2
apakah solusi ini benar-benar berfungsi? Setidaknya saya tidak bisa membuatnya bekerja. Sepertinya saya memiliki masalah yang sama seperti @EdRandall
Gerros

232

Maven versi 3.2.1 menambahkan fitur ini, Anda dapat menggunakan -plsakelar ( pintasan untuk --projectsdaftar) dengan !atau -( sumber ) untuk mengecualikan submodul tertentu.

mvn -pl '!submodule-to-exclude' install
mvn -pl -submodule-to-exclude install

Hati-hati dalam bash karakter! adalah karakter khusus, jadi Anda harus mengutipnya sendiri (seperti yang saya lakukan) atau menghindarinya dengan karakter backslash.

Sintaks untuk mengecualikan beberapa modul sama dengan inklusi

mvn -pl '!submodule1,!submodule2' install
mvn -pl -submodule1,-submodule2 install

EDIT Windows tampaknya tidak menyukai tanda kutip tunggal, tetapi perlu dalam bash; di Windows, gunakan tanda kutip ganda (terima kasih @awilkinson)

mvn -pl "!submodule1,!submodule2" install

27
Penting: jika Anda ingin mengecualikan submodule bersarang, Anda perlu menggunakan versi yang memenuhi syaratmvn -pl !com.acme:nestedmodule1
Leonard Brünings

3
Opsi -pl perlu '[groupId]:' sebelum artifactId, jadi kita harus menggunakan mvn -pl '!: Submodule-to-exclude' install
Honsen

4
Anda juga dapat menggunakan mvn -pl '!path/to/submodule/directory', tanpa menggunakan groupId dan artifactId. Jawaban saya berfungsi jika submodule1dan submodule2terletak di direktori saat ini.
Alexandre DuBreuil

Ini juga tidak layak bahwa jika Anda menggunakan -pldalam mvn install, Anda akan cenderung perlu menggunakannya untuk mvn deployjuga
majikman

39

Dimungkinkan untuk memutuskan proyek reaktor mana yang akan dibangun dengan menentukan -plargumen baris perintah:

$ mvn --help
[...]
 -pl,--projects <arg>                   Build specified reactor projects
                                        instead of all projects
[...]

Ia menerima daftar parameter yang dipisahkan koma di salah satu bentuk berikut:

  • jalur relatif folder yang berisi POM
  • [groupId]:artifactId

Dengan demikian, diberikan struktur sebagai berikut:

project-root [com.mycorp:parent]
  |
  + --- server [com.mycorp:server]
  |       |
  |       + --- orm [com.mycorp.server:orm]
  |
  + --- client [com.mycorp:client]

Anda dapat menentukan baris perintah berikut:

mvn -pl .,server,:client,com.mycorp.server:orm clean install

untuk membangun segalanya. Hapus elemen dalam daftar untuk membangun hanya modul yang Anda inginkan.


EDIT: seperti yang ditunjukkan blackbuild , pada Maven 3.2.1 Anda memiliki bendera baru-el yang mengecualikan proyek dari reaktor, serupa dengan apa yang -pldilakukan:


2
Terima kasih. Ini bekerja dengan baik untuk saya. Perhatikan juga bahwa Anda dapat menambahkan "-am" (AKA "--also-make") untuk membangun proyek yang dibutuhkan oleh modul yang telah Anda tentukan.
GaZ

1
Bagus! Saya digunakan mvn install -pl .untuk menginstal pom induk hanya di repo lokal tanpa membangun modul.
Marcin

Juga, lihat di jira.codehaus.org/browse/MNG-5230 . Anda sekarang dapat mengecualikan proyek dari reaktor.
blackbuild

1
Tautan MNG-5230 sejak codehaus.org ditutup: issues.apache.org/jira/browse/MNG-5230
Ed Randall

Sayangnya, itu tidak bekerja secara transitif, yaitu, jika saya memiliki top / mod1 / mod2, dan membangun dari atas, -pl '! Mod2' memunculkan kesalahan.
zakmck

4

Gagasan proyek multi-modul ada untuk melayani kebutuhan segmen proyek yang bergantung pada satu hal. Klien seperti itu tergantung pada layanan yang pada gilirannya tergantung pada EJBs atau rutinitas akses data. Anda dapat mengelompokkan tes integrasi berkelanjutan (CI) Anda dengan cara ini. Saya akan merasionalisasi dengan mengatakan bahwa tes CI harus terkunci dengan perubahan logika aplikasi.

Misalkan proyek Anda disusun sebagai:

project-root
  |
  + --- ci
  |
  + --- client
  |
  + --- server

Itu project-root/pom.xml mendefinisikan modul

<modules>
  <module>ci</module>
  <module>client</module>
  <module>server</module>
</modules>

Itu ci/pom.xml mendefinisikan profil seperti:

... 
<profiles>
  <profile>
    <id>default</id>
    <activation>
      <activeByDefault>true</activeByDefault>
    </activation>
    <plugin>
       <artifactId>maven-surefire-plugin</artifactId>
       <configuration>
         <skip>true</skip>
       </configuration>
     </plugin>
  </profile>
  <profile>
    <id>CI</id>
    <plugin>
       <artifactId>maven-surefire-plugin</artifactId>
       <configuration>
         <skip>false</skip>
       </configuration>
     </plugin>
  </profile>
</profiles>

Ini akan menghasilkan Maven melewatkan tes dalam modul ini kecuali ketika profil bernama CIaktif. Server CI Anda harus diinstruksikan untuk mengeksekusi mvn clean package -P CI. Situs web Maven memiliki penjelasan mendalam tentang mekanisme pembuatan profil .


2

sekarang ada (dari versi 1.1.1) bendera 'lewati' di pit.

Jadi Anda dapat melakukan hal-hal seperti:

    <profile>
        <id>pit</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.pitest</groupId>
                    <artifactId>pitest-maven</artifactId>
                    <configuration>
                        <skip>true</skip>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>

dalam modul Anda, dan lubang akan melewati

[INFO] --- pitest-maven: 1.1.3: mutationCoverage (default-cli) @ module-selenium --- [INFO] Melewati proyek

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.