Làm cách nào để loại trừ một mô-đun khỏi bản dựng lò phản ứng Maven?


98

Chúng tôi có một dự án Maven 2 với rất nhiều mô-đun trong đó. Thí dụ:

<modules>
  <module>common</module>
  <module>foo</module>
  <module>data</module>
  <module>bar</module>
  ... more ...
</module>

Giả sử mô-đun "dữ liệu" tốn thời gian để xây dựng và chúng tôi muốn loại trừ mô-đun này khi dự án được xây dựng bởi máy chủ CI. Hiện tại chúng tôi sử dụng hai tệp pom.xml để đạt được điều này. Một cái có tất cả các mô-đun trong đó và cái còn lại có tất cả các mô-đun ngoại trừ những mô-đun có thể bị bỏ lại cho CI. Nhưng điều đó khá khó chịu vì đôi khi chúng ta quên đặt một mô-đun mới vào cả hai tệp.

Có giải pháp nào không cần đến hai danh sách mô-đun riêng biệt không?

Câu trả lời:


73

Cách dễ nhất có thể là sử dụng profilesnhư thế này:

<project>
  ...
  <modules>
    <module>common</module>
    <module>foo</module>
    <module>bar</module>
  <modules>
  ...
  <profiles>
    <profile>
      <id>expensive-modules-to-build</id>
      <modules>
        <module>data</module>
      </modules>
    </profile>
  </profiles>
</project>

Sau đó, bạn nên kiểm tra các cách bạn có thể kích hoạt hồ sơ


Bạn sẽ làm gì nếu bạn cần dữ liệu xảy ra trước thông thường? Trong trường hợp này, các mô-đun hồ sơ sẽ được đặt sau các mô-đun mặc định theo thứ tự lò phản ứng. Có một khuôn mẫu cho việc buộc đặt hàng?
Peter Kahn

9
Thứ tự của mô-đun KHÔNG phải là thứ tự mà chúng sẽ xuất hiện trong lò phản ứng. Cách duy nhất để ảnh hưởng đến thứ tự, là tạo sự phụ thuộc giữa các mô-đun, tức là sử dụng thẻ <dependency>. Bạn không thể dựa vào thứ tự khai báo cho việc này.
SaM

7
@SaM Trên thực tế, kể từ Maven 3.0.5, Lò phản ứng sẽ tính đến thứ tự trong 'mô-đun' , mặc dù thứ tự do các phụ thuộc ra lệnh có mức độ ưu tiên cao hơn.
hellodanylo

Điều này sẽ phá vỡ một số plug-in khác, những người thất bại trong việc phát hiện các mô-đun trong hồ sơ cá nhân ngay cả những hồ sơ được kích hoạt
tribbloid

143

Với Maven 3.2.1, bây giờ bạn có thể sử dụng -pl !<module_name>,!<module_name>để loại trừ một số mô-đun nhất định khỏi việc xây dựng lò phản ứng.

Xem yêu cầu tính năng này: https://issues.apache.org/jira/browse/MNG-5230


Có an toàn để chuyển từ 3.0.4 sang 3.2.1 hay có những thay đổi lớn hơn không?
Tháng Một

Tôi đã chuyển từ 3.1 sang 3.2.1 mà không gặp vấn đề gì. Nhưng thành thật mà nói, bạn sẽ phải xây dựng để tìm ra nó.
Yogesh_D

30
Đừng quên thoát khỏi dấu chấm than trên dòng lệnh shell. Nó có một ý nghĩa rất đặc biệt, xem ví dụ: unix.stackexchange.com/questions/3747/…
Pavel

5
Rất tiếc, hiện có một vấn đề mở trong plugin Jenkins maven-project không hỗ trợ loại trừ mô-đun lò phản ứng: issue.jenkins-ci.org/browse/JENKINS-26472
Nick Vanderhoven

@Pavel: hoặc chỉ sử dụng -thay vì !, ví dụ-pl -<module_name>
msa

45

Các dự án cần xây dựng cũng có thể được chỉ định trên dòng lệnh mvn. Điều này sẽ loại bỏ nhu cầu về một pom riêng biệt, nhưng thay vào đó bạn sẽ phải thay đổi cấu hình CI mỗi khi có một mô-đun mới.

-pl,--projects <arg>                Comma-delimited list of specified
                                    reactor projects to build instead
                                    of all projects. A project can be
                                    specified by [groupId]:artifactId
                                    or by its relative path.

Có thể là sự kết hợp của cờ này và --also-make-dependentshoặc --also-makesẽ giảm gánh nặng bảo trì này một lần nữa.

-am,--also-make                     If project list is specified, also
                                    build projects required by the
                                    list
-amd,--also-make-dependents         If project list is specified, also
                                    build projects that depend on
                                    projects on the list

Điều này có vấn đề giống như sử dụng hai poms riêng biệt. Chúng tôi phải đến những nơi mà chúng tôi xác định các mô-đun. Đó là điều tôi đang cố gắng tránh.
kayahr

Đây là một giải pháp tốt. Không cần phải cập nhật pom. mvn clean install -pl mysubproject
nicolas-f

22

Tôi giả sử bạn muốn bản dựng mặc định luôn xây dựng mọi thứ, bất kể tốc độ, để các nhà phát triển mới có thể bắt đầu nhanh chóng mà không cần phải hiểu nhiều về POM. Bạn có thể sử dụng các cấu hình như sau:

<modules>
    <module>common</module>
    <module>foo</module>
    <module>bar</module>
  </modules>
  ...
  <profiles>
    <profile>
      <id>expensive-modules-to-build</id>
      <activation>
         <activeByDefault>true</activeByDefault>
      </activation>
      <modules>
        <module>data</module>
      </modules>
    </profile>
  </profiles>
</project>

Vấn đề với điều này là nếu một nhà phát triển chỉ định một cấu hình khác trên dòng lệnh, thì cấu hình đó expensive-modules-to-buildsẽ không được bao gồm (trừ khi nhà phát triển cũng chỉ định nó). Điều này làm cho việc nhớ hồ sơ nào cần được đưa vào sẽ trở nên phức tạp.

Đây là một cách tuyệt vời để giải quyết vấn đề đó. Cả hai cấu hình luôn được bao gồm, vì tệp pom.xml luôn tồn tại. Vì vậy, để loại trừ các mô-đun đắt tiền, bạn có thể sử dụng -P!full-buildtrên dòng lệnh.

<profiles>
    <profile>
        <id>full-build</id>
        <activation>
            <file>
                <exists>pom.xml</exists>
            </file>
        </activation>
        <modules>
            <module>data</module>
        </modules>
    </profile>
    <profile>
        <id>short-build</id>
        <activation>
            <file>
                <exists>pom.xml</exists>
            </file>
        </activation>
        <modules>
           <module>common</module>
           <module>foo</module>
           <module>bar</module>
        </modules>
    </profile>
</profiles>

Câu trả lời rất hay. Nhưng bạn có thực sự cần hai cấu hình trong ví dụ mã thứ 2 không? Liệu cấu hình đơn từ ví dụ mã đầu tiên với phần tử kích hoạt đã thay đổi có hoạt động không?
Arend v. Reinersdorff

@ Arendv.Reinersdorff có, tuy nhiên, câu trả lời này cũng hoạt động với các cấu hình khác trong bản dựng mà bạn có thể muốn đưa vào theo mặc định. Nhìn chung, mặc dù tôi nghĩ câu trả lời khác với -pl !<module_name>,!<module_name>là tốt hơn thế này cũ
artbristol

1
Thủ thuật kích hoạt hay. Nó đã giải quyết cho tôi các vấn đề với <activeByDefault> không phải lúc nào cũng hoạt động!
Gab

7

Một ý tưởng khác: Các mô-đun lò phản ứng có thể được lồng vào nhau, vì vậy có thể nhóm các mô-đun xây dựng nhanh và chậm của bạn thành các nhóm riêng biệt và sau đó thêm một pom tổng hợp khác có chứa hai mô-đun này làm mô-đun. Máy chủ CI của bạn sau đó chỉ có thể tham chiếu đến pom có ​​chứa các mô-đun xây dựng nhanh.

<artifactId>fast</artifactId>
<modules>
    <module>fast-a</module>
    <module>fast-b</module>
    <module>fast-c</module>
</module>

<artifactId>all</artifactId>
<modules>
    <module>fast</module>
    <module>slow</module>
</module>

1

Bạn có thể sử dụng hồ sơ maven . Trong môi trường xây dựng của chúng tôi, chúng tôi đã tạo một hồ sơ quickvô hiệu hóa nhiều plugin và thử nghiệm thực thi.

Điều này được thực hiện bởi

    <profile>
        <id>quick</id>
        <properties>
            <skipTests>true</skipTests>
            <!-- others... -->
        </properties>   
        <build>
            <plugins>
                 <!-- configuration... -->
            </plugins>
        </build>
    </profile>

Và sau đó chúng tôi gọi maven theo cách sau

mvn groupId:artifactId:goal -P quick

Bạn có thể tắt tính năng biên dịch và các plugin tiêu chuẩn khác trong phần mềm của mô-đun để tăng tốc độ.


2
Có, để vô hiệu hóa các thử nghiệm, điều này hoạt động tốt. Nhưng làm thế nào tôi có thể sử dụng các cấu hình để loại trừ các mô-đun mà KHÔNG có hai danh sách mô-đun riêng biệt trong pom? Theo như tôi biết, tôi cần đặt danh sách mô-đun đầy đủ vào một phần hồ sơ và danh sách mô-đun xây dựng nhanh vào một phần hồ sơ khác. Vì vậy, điều này có cùng một vấn đề khi sử dụng hai poms riêng biệt: Tôi có hai danh sách mô-đun để duy trì.
kayahr

Loại trừ mô-đun thực sự không phải là cách để thực hiện mọi thứ trong maven và kinh nghiệm của tôi với maven là tốt hơn hết hãy gắn bó với cách mọi thứ được thực hiện, nếu không bạn sẽ gặp phải rất nhiều vấn đề ... Vì vậy, thực sự những gì tôi đang đề xuất là không loại bỏ mô-đun, nhưng để làm cho mô-đun này ít tốn thời gian hơn.
Nr 9

Vấn đề với maven là 'cách mọi thứ được thực hiện' thường không phù hợp với 'cách mọi thứ được thực hiện trong thế giới thực', làm cho trải nghiệm của maven kém và đau đớn. Các nhà phát triển sẽ thực hiện tốt việc đào tạo UX.
Ed Randall

0

Không chính xác câu trả lời mà những người này yêu cầu. Tình huống của tôi là tôi chỉ muốn triển khai pom mẹ. Tôi đang sử dụng spring-boot-thin-layouttrong một mô-đun con. Điều này yêu cầu mô-đun mẹ phải được triển khai thành mô-đun nghệ thuật. Tôi đã thêm phần sau vào dự án của mình. Nó cho phép bỏ qua installvà / hoặc deploygiai đoạn.

Trong pom mẹ của tôi:

<properties>
    <disable.install>true</disable.install>
    <disable.deploy>true</disable.deploy>
    <enable.deployAtEnd>true</enable.deployAtEnd>
</properties>

<profiles>
    <profile>
        <id>deploy-parent</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <disable.install>true</disable.install>
            <disable.deploy>true</disable.deploy>
            <deployAtEnd>${enable.deployAtEnd}</deployAtEnd>
        </properties>
        <build>
            <finalName>${project.version}</finalName>
        </build>
    </profile>
</profiles>

Và trong (các) pom con của tôi hoặc bất kỳ mô-đun nào bạn không muốn triển khai với cha mẹ:

<properties>
    <maven.install.skip>${disable.install}</maven.install.skip>
    <maven.deploy.skip>${disable.deploy}</maven.deploy.skip>
    <deployAtEnd>${enable.deployAtEnd}</deployAtEnd>
</properties>

Vì vậy, rất hiệu quả khi tôi chạy mvn deploytrên pom mẹ, nó sẽ biên dịch tất cả các mô-đun, không chạy cài đặt trên bất kỳ thứ gì và sau đó triển khai bất kỳ mô-đun nào không có <maven.deploy.skip>${disable.deploy}</maven.deploy.skip>trong thuộc tính của nó. Vì vậy, trong trường hợp của tôi, chỉ triển khai cha mẹ.

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.