2012-08-14 32 views
15

Khi sử dụng plugin maven-surefire và cả hai bao gồm và loại trừ, thứ tự chúng được xử lý? Hơn nữa, nếu bạn có 3 bộ kiểm tra, đầu tiên là bộ cơ sở, thứ hai và thứ ba là các trường hợp đặc biệt, bạn có thể sử dụng các cấu hình để bao gồm/loại trừ thêm không? Cài đặt bao gồm/loại trừ tiểu sử sẽ được hợp nhất như thế nào? Ví dụ, tôi muốn làm một cái gì đó như thế này:maven-surefire-plugin bao gồm/loại trừ ưu tiên

<build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <version>2.12.2</version> 
     <configuration> 
      <excludes> 
      <exclude>/org/mycompany/dataset/test/ExtractProd*.java</exclude> <!-- requires special network connectivity --> 
      <exclude>/org/mycompany/dataset/test/LargeDataset*.java</exclude> <!-- requires lengthy processing --> 
      </excludes> 
     </configuration> 
     </plugin> 
    </plugins> 
    </build> 

    <profiles> 
    <profile> 
     <id>connectedToProdNetwork</id> 
     <build> 
     <plugins> 
      <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-surefire-plugin</artifactId> 
      <configuration> 
       <includes> 
       <include>/org/mycompany/dataset/test/ExtractProd*.java</include> 
       </includes> 
      </configuration> 
      </plugin> 
     </plugins> 
     </build> 
    </profile> 
    <profile> 
     <id>runForAsLongAsYouNeed</id> 
     <build> 
     <plugins> 
      <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-surefire-plugin</artifactId> 
      <configuration> 
       <includes> 
       <include>/org/mycompany/dataset/test/LargeDataset*.java</include> 
       </includes> 
      </configuration> 
      </plugin> 
     </plugins> 
     </build> 
    </profile> 
    </profiles> 

Và sau đó có thể chạy như thế này:

mvn package -P connectedToProdNetwork 

hoặc

mvn package -P runForAsLongAsYouNeed 

hoặc

mvn package -P connectedToProdNetwork,runForAsLongAsYouNeed 

---- CẬP NHẬT -----

Sử dụng mvn help:effective-pom -P [profileA] tôi đã có thể xác định rằng nếu tôi chỉ định một hồ sơ duy nhất, pom hiệu quả kết quả sẽ là:

 <configuration> 
      <includes> 
      <include>[includeFromProfileA]</include> 
      </includes> 
      <excludes> 
      <exclude>/org/mycompany/dataset/test/ExtractProd*.java</exclude> <!-- requires special network connectivity --> 
      <exclude>/org/mycompany/dataset/test/LargeDataset*.java</exclude> <!-- requires lengthy processing --> 
      </excludes> 
     </configuration> 

Và nếu tôi cung cấp nhiều hơn một hồ sơ, mvn help:effective-pom -P [profileA],[profileB]:

 <configuration> 
      <includes> 
      <include>[includeFromProfileAOrBSeeminglyArbitraryChoice]</include> 
      </includes> 
      <excludes> 
      <exclude>/org/mycompany/dataset/test/ExtractProd*.java</exclude> <!-- requires special network connectivity --> 
      <exclude>/org/mycompany/dataset/test/LargeDataset*.java</exclude> <!-- requires lengthy processing --> 
      </excludes> 
     </configuration> 

Và cuối cùng, nếu tôi thêm thuộc tính combine.children="append" vào phần tử <includes> của cấu hình tiểu sử và cung cấp cả hai cấu hình, mvn help:effective-pom -P [profileA],[profileB]:

 <configuration> 
      <includes combine.children="append"> 
      <include>[includeFromProfileA]</include> 
      <include>[includeFromProfileB]</include> 
      </includes> 
      <excludes> 
      <exclude>/org/mycompany/dataset/test/ExtractProd*.java</exclude> <!-- requires special network connectivity --> 
      <exclude>/org/mycompany/dataset/test/LargeDataset*.java</exclude> <!-- requires lengthy processing --> 
      </excludes> 
     </configuration> 

Tuy nhiên, bây giờ mỗi tệp được chỉ định là cả <include><exclude>, điều gì sẽ xảy ra?

---- UPDATE 2 ----

Trên thực tế chạy một xây dựng với cấu hình này:

<configuration> 
    <includes> 
    <include>**/TestA.java</include> 
    </includes> 
    <excludes> 
    <exclude>**/TestA.java</exclude> 
    </excludes> 
</configuration> 

Liệu KHÔNG chạy Testa, vì vậy nó xuất hiện một <exclude> sẽ chế ngự một số <include>. Lưu ý rằng vì lợi ích đầy đủ, tôi đã đảo ngược thứ tự và đặt <excludes> trước <includes> nhưng hành vi không thay đổi. Nếu bất kỳ ai cũng có thể tìm thấy một nơi nào đó thiếu mã nguồn nơi hành vi này được vạch ra, tôi sẽ sẵn lòng cung cấp cho họ câu trả lời ...

+3

Loại trừ phần ghi đè bao gồm bởi vì thông thường mọi người bao gồm tập hợp lớn hơn nhu cầu của họ và chỉ cần một số được lấy ra. Điều này thường làm cho một danh sách ngắn hơn và ít công việc hơn. – Steven

+0

@Steven, yeah, phù hợp với những gì tôi đã trải qua trong quá trình thử nghiệm. Bạn có biết bất cứ nơi nào điều này là _officially_ nêu để tôi sẽ biết họ sẽ không chỉ thay đổi hành vi này trong tương lai? Dù sao, cảm ơn người đàn ông. – Lucas

+0

Tôi nghĩ rằng cách tiếp cận thử nghiệm thường là cách tốt nhất để chắc chắn :) - vẫn: tham chiếu pom đưa ra một số gợi ý về thứ tự: http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle .html - cho ví dụ. thực thi kế thừa chạy đầu tiên. Thường thì các plugin sử dụng loại trừ/bao gồm theo thứ tự của pom. Vì vậy, bạn có thể bao gồm một cái gì đó đặc biệt trong khi loại trừ tất cả hoặc bao gồm tất cả và loại trừ một cái gì đó đặc biệt. Trong nghi ngờ thứ tự trong pom sẽ được theo sau (trong hầu hết các trường hợp và bổ sung) – wemu

Trả lời

4

Tôi không thể tìm thấy tài liệu chính thức về plugin chắc chắn, nhưng thực sự loại trừ ghi đè bao gồm là một cách tiếp cận chung và cũng được Maven áp dụng trong các ngữ cảnh tương tự khác, như đối với tài nguyên.

Quan chức này chỉ là một thông tin liên quan (tôi thấy) xuất phát từ Maven POM tài liệu tham khảo chính thức, here:

bao gồm: Một tập hợp các mẫu file trong đó quy định các tập tin bao gồm như là tài nguyên dưới đó thư mục được chỉ định, sử dụng * làm ký tự đại diện.

không bao gồm: Cấu trúc tương tự bao gồm nhưng chỉ định những tệp cần bỏ qua. Trong các xung đột giữa bao gồm và loại trừ, loại trừ các chiến thắng.

LƯU Ý: Tôi đã thêm định dạng in đậm cuối cùng vào câu lệnh thú vị.

Vì vậy, nhiều hơn có lẽ cách tiếp cận tương tự được sử dụng trên các plugin maven chính thức (nói chung, tất cả các plugin có tiền tố org.apache.maven.plugins groupId và maven- như artifactId).

+1

Phát hiện tuyệt vời ... không chắc tôi nên đánh dấu nó như là câu trả lời vì nó không phải là kỹ thuật dứt khoát, nhưng chắc chắn _userful_ thông tin. – Lucas