Bỏ qua một mô hình con trong quá trình xây dựng Maven


160

Chúng tôi có nhu cầu có thể bỏ qua một mô hình con trong các môi trường nhất định.

Các mô-đun trong câu hỏi có chứa các bài kiểm tra tích hợp và mất nửa giờ để chạy. Vì vậy, chúng tôi muốn bao gồm nó khi xây dựng trên máy chủ CI, nhưng khi các nhà phát triển xây dựng cục bộ (và các thử nghiệm được chạy), chúng tôi muốn bỏ qua mô-đun đó.

Có cách nào để làm điều này với một thiết lập hồ sơ? Tôi đã thực hiện một số googling và xem xét các câu hỏi / câu trả lời khác ở đây và không tìm thấy một giải pháp tốt.

Tôi cho rằng một tùy chọn là loại bỏ pom.xmlhoàn toàn mô hình con đó khỏi cha mẹ và chỉ cần thêm một dự án khác trên máy chủ CI của chúng tôi để xây dựng mô-đun đó.

Gợi ý?


Tại sao không phải là Maven Way? Đó là một yêu cầu hoàn toàn hợp lệ đối với tôi.
MaDa

Hừm. Bây giờ tôi không thể tìm thấy những nơi mà mọi người dường như đang tranh cãi về vấn đề này ... vì vậy tôi đã cập nhật câu hỏi ban đầu của mình để xóa bỏ tuyên bố rằng đây dường như không phải là "Con đường Maven".
denishaskin

Câu trả lời:


149

Chắc chắn, điều này có thể được thực hiện bằng cách sử dụng hồ sơ. Bạn có thể làm một cái gì đó như sau trong pom.xml cha mẹ của bạn.

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

Trong CI của bạn, bạn sẽ chạy maven với cihồ sơ, nghĩa làmvn -P ci clean install


4
Câu trả lời tuyệt vời! Tôi không biết tại sao tôi gặp quá nhiều khó khăn khi tìm ra tài liệu Maven này. Một gợi ý tôi sẽ đưa ra là vì tôi thích các thử nghiệm tích hợp được chạy theo mặc định, tôi đã thêm vào activeByDefaulthồ sơ đó và sau đó phải thêm một hồ sơ trống khác (ví dụ skip-integration-tests) để có thể bỏ qua chúng.
denishaskin

7
Có cách nào để làm điều này mà không cần sao chép tất cả những thứ được chia sẻ không?
JonnyRaa

7
Coi chừng, nếu bạn sử dụng plugin phát hành maven, có vẻ như nó không cập nhật số phiên bản của các mô hình con được ẩn đằng sau một công tắc hồ sơ. Bạn có thể có các mô-đun phụ với các số phiên bản khác nhau cho phần còn lại của dự án của bạn ...
Ardesco

8
Thật không may, uing hồ sơ bạn không thể loại trừ một mô-đun được đề cập trước đó trong phần <mô-đun> chính của pom. Các vấn đề của JIRA.apache.org/jira/browse/MNG-5230 (và toàn bộ cấu trúc pom) có thể đã được thực hiện đầy đủ tốt hơn rất nhiều với một chút suy nghĩ cẩn thận hơn.
Ed Randall

2
giải pháp này có thực sự hiệu quả không? Ít nhất tôi không thể làm cho nó hoạt động. Có vẻ như tôi có cùng một vấn đề như @EdRandall
Gerros

231

Phiên bản Maven 3.2.1 đã thêm tính năng này, bạn có thể sử dụng công -pltắc ( phím tắt cho --projectsdanh sách) với !hoặc -( nguồn ) để loại trừ các mô hình con nhất định.

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

Hãy cẩn thận trong bash nhân vật! là một ký tự đặc biệt, vì vậy bạn hoặc phải trích dẫn nó (như tôi đã làm) hoặc thoát nó bằng ký tự dấu gạch chéo ngược.

Cú pháp để loại trừ nhiều mô-đun giống như bao gồm

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

EDIT Windows dường như không thích các trích dẫn đơn lẻ, nhưng nó là cần thiết trong bash; trong Windows, sử dụng dấu ngoặc kép (cảm ơn @awilkinson)

mvn -pl "!submodule1,!submodule2" install

27
Quan trọng: nếu bạn muốn loại trừ một mô hình con lồng nhau, bạn cần sử dụng phiên bản đủ điều kiệnmvn -pl !com.acme:nestedmodule1
Leonard Brünings

3
Tùy chọn -pl cần '[groupId]:' trước artifactId, vì vậy chúng ta nên sử dụng mvn -pl '!: Subodule-to-loại' cài đặt
Honsen

4
Bạn cũng có thể sử dụng mvn -pl '!path/to/submodule/directory'mà không cần sử dụng groupId và artifactId. Câu trả lời của tôi hoạt động nếu submodule1submodule2được đặt trong thư mục hiện tại.
Alexandre DuBreuil

Nó cũng đáng gì mà nếu bạn sử dụng -pltrong mvn install, bạn có thể sẽ cần phải sử dụng nó cho mvn deploycũng
majikman

39

Có thể quyết định xây dựng dự án lò phản ứng nào bằng cách chỉ định -plđối số dòng lệnh:

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

Nó chấp nhận một danh sách các tham số được phân tách bằng dấu phẩy theo một trong các hình thức sau:

  • đường dẫn tương đối của thư mục chứa POM
  • [groupId]:artifactId

Do đó, đưa ra cấu trúc sau:

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

Bạn có thể chỉ định dòng lệnh sau:

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

để xây dựng mọi thứ. Xóa các thành phần trong danh sách để chỉ xây dựng các mô-đun bạn muốn.


EDIT: như blackbuild đã chỉ ra, kể từ Maven 3.2.1, bạn có một -elcờ mới loại trừ các dự án khỏi lò phản ứng, tương tự như những gì -pl:


1
Cảm ơn. Điều này làm việc tốt cho tôi. Cũng lưu ý rằng bạn có thể thêm "-am" (AKA "- cũng như tạo") để xây dựng các dự án được yêu cầu bởi các mô-đun bạn đã chỉ định.
GaZ

1
Tuyệt quá! Tôi đã sử dụng mvn install -pl .để cài đặt pom cha chỉ trong repo cục bộ mà không xây dựng các mô-đun.
Marcin

Ngoài ra, hãy xem jira.codehaus.org/browse/MNG-5230 . Bây giờ bạn có thể loại trừ các dự án từ lò phản ứng.
blackbuild

1
Liên kết MNG-5230 kể từ khi codehaus.org đóng cửa: problems.apache.org/jira/browse/MNG-5230
Ed Randall

Thật không may, nó không hoạt động quá mức, tức là, nếu tôi có top / mod1 / mod2 và xây dựng từ đầu, -pl '! Mod2' sẽ phát sinh lỗi.
zakmck

4

Khái niệm về các dự án đa mô-đun là có để phục vụ nhu cầu của các phân khúc tiền mã hóa của một dự án. Một khách hàng như vậy phụ thuộc vào các dịch vụ mà lần lượt phụ thuộc vào các EJB hoặc các thói quen truy cập dữ liệu. Bạn có thể nhóm các bài kiểm tra tích hợp liên tục (CI) theo cách này. Tôi sẽ hợp lý hóa rằng bằng cách nói rằng các bài kiểm tra CI cần phải được thực hiện theo từng bước với các thay đổi logic ứng dụng.

Giả sử dự án của bạn được cấu trúc như sau:

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

Các project-root/pom.xmlmô-đun xác định

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

Các ci/pom.xmlđịnh nghĩa hồ sơ như:

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

Điều này sẽ dẫn đến các thử nghiệm bỏ qua Maven trong mô-đun này trừ khi cấu hình có tên CIđang hoạt động. Máy chủ CI của bạn phải được hướng dẫn để thực hiện mvn clean package -P CI. Trang web Maven có một lời giải thích sâu sắc về cơ chế định hình .


2

bây giờ (từ phiên bản 1.1.1) cờ 'bỏ qua' trong hố.

Vì vậy, bạn có thể làm những việc như:

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

trong mô-đun của bạn và hố sẽ bỏ qua

[INFO] --- pitest-maven: 1.1.3: m mutCoverage (default-cli) @ module-selenium --- [INFO] Bỏ qua dự án

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.