2011-11-29 22 views
99

Chúng ta cần phải bỏ qua một mô-đun con trong một số môi trường nhất định.Bỏ qua một mô-đun con trong khi xây dựng Maven

Mô-đun được đề cập chứa kiểm tra tích hợp và phải 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 tại địa phương (và thử nghiệm chạy), chúng tôi muốn bỏ qua mô-đun đó.

Có cách nào để thực hiện việc này với cài đặt tiểu sử không? Tôi đã thực hiện một số googling và nhìn vào 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à xóa mô-đun con đó khỏi phụ huynh pom.xml hoàn toàn và chỉ 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 đó.

Đề xuất?

+0

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

+0

Hmm. 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 luận chống lại điều này ... vì vậy tôi đã cập nhật câu hỏi ban đầu của tôi để loại bỏ tuyên bố của tôi rằng điều này dường như không phải là "The Maven Way". – denishaskin

Trả lời

113

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 cấu hình ci, tức làmvn -P ci clean install

+2

Ooh! Tốt lắm. Đơn giản hơn đề xuất của tôi. –

+3

Câu trả lời hay! Tôi không biết tại sao tôi gặp rất nhiều rắc rối khi tìm ra tài liệu Maven này. Một gợi ý tôi sẽ làm là vì tôi thích các bài kiểm tra tích hợp được chạy theo mặc định, tôi đã thêm 'activeByDefault' vào cấu hình đó, và sau đó phải thêm một cấu hình trống khác (ví dụ:'skip-integration-tests') để có thể bỏ qua chúng. – denishaskin

+5

có cách nào để thực hiện việc này mà không cần sao chép tất cả nội dung được chia sẻ không? –

5

Khái niệm về các dự án đa mô-đun có sẵn để phục vụ nhu cầu của các phân đoạn độc lập 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 nói hoặc các thường trình 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 điều đó bằng cách nói rằng các bài kiểm tra CI cần phải ở trong bước khóa với các thay đổi logic ứng dụng.

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

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

Các project-root/pom.xml định nghĩa module

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

Các ci/pom.xml xác định 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> 

này sẽ dẫn đến Maven bỏ qua các bài kiểm tra trong mô-đun này trừ khi hồ sơ n amed 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 của Maven có số in-depth explanation of the profiling mechanism.

32

Có thể để quyết định các dự án lò phản ứng để xây dựng bằng cách xác định dòng lập luận -pl lệnh:

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

Nó chấp nhận một dấu phẩy tách ra danh sách các tham số trong 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

Như vậy, với cơ cấu như 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 các dòng lệnh sau:

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

để xây dựng tất cả mọi thứ. Loại bỏ các phần tử trong danh sách để chỉ xây dựng các mô-đun bạn vui lòng.


EDIT: như blackbuild chỉ ra, tính đến Maven 3.2.1 bạn có a new -el flag loại trừ các dự án từ các lò phản ứng, tương tự như những gì -pl làm:

+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 "--also-make") để cũng 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 vời! Tôi đã sử dụng 'mvn install -pl .' để cài đặt pom mẹ chỉ trong repo cục bộ mà không cần xây dựng module. – Marcin

+0

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

111

phiên bản Maven 3.2.1 bổ sung tính năng này, bạn có thể sử dụng công tắc -pl với "!" để loại trừ các mô-đun con nhất định.

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

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

Cú pháp để loại trừ nhiều mô-đun là tương tự như sự bao gồm

mvn -pl '!submodule1,!submodule2' install 

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

mvn -pl "!submodule1,!submodule2" install 
+9

Quan trọng: nếu bạn muốn loại trừ một mô-đun con lồng nhau, bạn cần sử dụng phiên bản đủ điều kiện 'mvn -pl ! com.acme: nestedmodule1' –

2

hiện có (từ 1.1.1 phiên bản) 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 module của bạn, và hố sẽ bỏ

[INFO] --- pitest-maven: 1.1.3: mutationCoverage (mặc định-cli) @ module-selenium --- [INFO] Bỏ qua dự án

Các vấn đề liên quan