Kiểm tra Maven phụ thuộc trong dự án đa mô-đun


86

Tôi sử dụng maven để xây dựng một dự án nhiều mô-đun. Mô-đun 2 của tôi phụ thuộc vào Mô-đun 1 src ở phạm vi biên dịch và mô-đun 1 kiểm tra trong phạm vi kiểm tra.

Mô-đun 2 -

   <dependency>
       <groupId>blah</groupId>
       <artifactId>MODULE1</artifactId>
       <version>blah</version>
       <classifier>tests</classifier>
       <scope>test</scope>
   </dependency>

Điều này hoạt động tốt. Giả sử mô-đun 3 của tôi phụ thuộc vào src Module1 và các bài kiểm tra tại thời điểm biên dịch.

Mô-đun 3 -

   <dependency>
       <groupId>blah</groupId>
       <artifactId>MODULE1</artifactId>
       <version>blah</version>
       <classifier>tests</classifier>
       <scope>compile</scope>
   </dependency>

Khi tôi chạy mvn clean install, bản dựng của tôi chạy cho đến mô-đun 3, không thành công ở mô-đun 3 vì nó không thể giải quyết sự phụ thuộc kiểm tra mô-đun 1. Sau đó, tôi thực hiện một mình mvn installtrên mô-đun 3, quay lại và chạy mvn installtrên pom mẹ của tôi để làm cho nó xây dựng. Làm thế nào tôi có thể sửa lỗi này?


Bạn có thể vui lòng chia sẻ bố mẹ của bạn trông như thế nào không?
Chris Gummer

Câu trả lời:


127

Tôi nghi ngờ về những gì bạn đang cố gắng thực hiện nhưng tôi sẽ giả sử bạn muốn sử dụng lại các bài kiểm tra mà bạn đã tạo cho một dự án (module1) trong một dự án khác. Như đã giải thích trong phần ghi chú ở cuối Hướng dẫn sử dụng các bài kiểm tra đính kèm :

Lưu ý rằng các phiên bản trước của hướng dẫn này được đề xuất sử dụng <classifier>tests</classifier>thay thế <type>test-jar</type>. Mặc dù điều này hiện hoạt động đối với một số trường hợp, nhưng nó không hoạt động bình thường trong quá trình xây dựng lò phản ứng của mô-đun JAR thử nghiệm và bất kỳ người tiêu dùng nào nếu giai đoạn vòng đời trước khi cài đặt được gọi. Trong trường hợp như vậy, Maven sẽ không giải quyết JAR thử nghiệm từ đầu ra của việc xây dựng lò phản ứng mà từ kho lưu trữ cục bộ / từ xa. Rõ ràng, JAR từ kho lưu trữ có thể đã lỗi thời hoặc bị thiếu hoàn toàn, gây ra lỗi xây dựng (xem MNG-2045 ).

Vì vậy, trước tiên, để đóng gói các bài kiểm tra đã biên dịch trong JAR và triển khai chúng để sử dụng lại chung, hãy định cấu hình maven-jar-pluginnhư sau:

<project>
  <build>
    <plugins>
     <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-jar-plugin</artifactId>
       <version>2.2</version>
       <executions>
         <execution>
           <goals>
             <goal>test-jar</goal>
           </goals>
         </execution>
       </executions>
     </plugin>
    </plugins>
  </build>
</project>

Sau đó, cài đặt / triển khai tạo tác JAR thử nghiệm như bình thường (sử dụng mvn installhoặc mvn deploy).

Cuối cùng, để sử dụng JAR thử nghiệm, bạn nên chỉ định một phụ thuộc với một loại được chỉ định là test-jar:

<project>
  ...
  <dependencies>
    <dependency>
      <groupId>com.myco.app</groupId>
      <artifactId>foo</artifactId>
      <version>1.0-SNAPSHOT</version>
      <type>test-jar</type>
      <scope>test</scope>
    </dependency>
  </dependencies>
  ...
</project>

3
Pascal. Trước hết, cảm ơn rất nhiều vì đã trả lời tất cả các câu hỏi của maven !! Về câu hỏi này. Tôi vẫn còn một vấn đề. Tôi có một số lớp testBase trong một trong những mô-đun cốt lõi của mình mà tôi muốn sử dụng trong tất cả các đối tượng con. Chúng tôi hiện có bản dựng maven trong CI của chúng tôi. Nếu tôi không muốn thực hiện bất kỳ cài đặt triển khai nào cho test-jar và chỉ để kiểm tra một bản sao mới từ trung kế và chạy thử nghiệm mvn. Điều này không thành công, vì tôi chưa có bình thử nghiệm ở bất kỳ đâu. Bất kỳ ý tưởng làm thế nào để đối phó với điều đó?
Roman

@Roman Chạy cài đặt là cách "tự nhiên". Nhưng có vẻ như bạn đã tìm thấy một cách giải quyết.
Pascal Thivent

Có vẻ như vấn đề này 3559 chứ không phải năm 2045 mới là vấn đề ở thời điểm này: jira.codehaus.org/browse/MNG-3559
HDave

Altough điều này giải thích những gì đang xảy ra nó không cung cấp giải pháp thay thế. Nó chỉ gợi ý làm những gì OP (và ví dụ như tôi) đang làm.
Antoniossss

19

Về nhận xét của tôi cho câu hỏi Pascals, tôi nghĩ rằng tôi đã tìm thấy một câu trả lời phù hợp:

<plugins>
    <plugin>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.2</version>
        <executions>
            <execution>
            <goals>
                <goal>test-jar</goal>
            </goals>
            <phase>test-compile</phase>
        </execution>
        </executions>
        <configuration>
            <outputDirectory>${basedir}\target</outputDirectory>
        </configuration>
    </plugin>
</plugins>

Sự khác biệt chính ở đây như bạn thấy ở đây là <phase>thẻ.

Tôi sẽ tạo test-jar và nó sẽ có sẵn trong giai đoạn biên dịch của các thử nghiệm và không chỉ sau giai đoạn gói.

Làm việc cho tôi.


1
Vâng, rất tiện lợi. Cám ơn vì đã chia sẻ. Tôi đoán rằng cách tiếp cận triển khai chỉ tốt hơn khi bạn có một thư mục công ty (vâng, tôi biết điều này rất được khuyến khích). Cảm ơn @Roman
Damien

2

Như https://maven.apache.org/plugins/maven-jar-plugin/examples/create-test-jar.html nói:

Cách tạo một jar chứa các lớp thử nghiệm Khi bạn muốn tạo một jar chứa các lớp thử nghiệm, bạn có thể muốn sử dụng lại các lớp đó. Có hai cách để giải quyết vấn đề này:

  1. The easy way Tạo một jar đính kèm với các lớp thử nghiệm từ dự án hiện tại và loại bỏ các phụ thuộc phạm vi thử nghiệm bắc cầu của nó.

  2. The preferred way Tạo một dự án riêng biệt với các lớp thử nghiệm.

Hãy đọc bài viết đó để biết chi tiết.

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.