2012-03-21 26 views
15

Tôi vừa trải qua một trường hợp phụ thuộc trực tiếp vào dự án maven của tôi có hai phiên bản khác nhau của một phụ thuộc transitive cụ thể.Maven - Phát hiện nhiều phiên bản của cùng một phụ thuộc

Trong trường hợp đặc biệt của tôi, tôi đã phụ thuộc trực tiếp vào như sau:

<dependency> 
     <groupId>org.jclouds.driver</groupId> 
     <artifactId>jclouds-sshj</artifactId> 
     <version>${jclouds.version}</version> 
    </dependency> 

<dependency> 
     <groupId>org.mule.modules</groupId> 
     <artifactId>mule-module-jersey</artifactId> 
     <version>${mule.version}</version> 
    </dependency> 

Cả hai phụ thuộc đã có một (sâu) phụ thuộc bắc cầu vào com.sun.jersey: jersey -core, nhưng với các phiên bản khác nhau cho mỗi. Maven đã không thất bại về điều này hoặc thậm chí cảnh báo (hoặc nếu nó đã làm, tôi không bao giờ nhìn thấy nó!) Rằng một điều như vậy đã xảy ra ... và như vậy tôi không bao giờ nhận thấy nó cho đến khi gỡ lỗi một vấn đề đã xảy ra khi phiên bản của jersey- cốt lõi đưa vào bởi sự phụ thuộc của jclouds gây ra một số thứ để phá vỡ.

Có plugin maven hay một số công cụ tồn tại khác sẽ phát hiện kiểu phụ thuộc quá tải sâu này và ít nhất cảnh báo người dùng (hoặc không thực thi maven) nếu phát hiện va chạm ... ngay cả khi hành vi maven mặc định là chỉ cần chọn phiên bản đầu tiên xuất hiện khi giải quyết các phụ thuộc?

Trả lời

24

Sử dụng plugin Trình bổ trợ phụ thuộc. Nó sẽ dừng việc xây dựng khi các phụ thuộc không hội tụ đúng cách.

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-enforcer-plugin</artifactId> 
    <version>1.0.1</version> 
    <executions> 
     <execution> 
     <id>enforce</id> 
     <configuration> 
      <rules> 
      <DependencyConvergence /> 
      </rules> 
     </configuration> 
     <goals> 
      <goal>enforce</goal> 
     </goals> 
     </execution> 
    </executions> 
    </plugin> 
+0

điều này dường như chính xác những gì tôi đang tìm kiếm. Tôi không nghĩ rằng để kiểm tra các plugin thực thi cho việc này. – whaley

3

bạn có thể chạy depenency báo cáo hoặc sử dụng cây phụ thuộc:

mvn phụ thuộc: cây -Dverbose -Dincludes = commons-bộ sưu tập

2

Bạn chỉ có thể có một cái nhìn tổng quan tại dependency hiercharchy của bạn. Điều này sẽ không cảnh báo bạn, nhưng bạn có thể xem các phiên bản nhất định có bị hủy bỏ cho các phiên bản mới hơn của cùng một thư viện hay không.

+0

bạn đang đề cập đến phụ thuộc đang chạy: cây có tiết được chỉ định là @DmitryB được đề xuất không? – whaley

1

Bạn có thể giải quyết xung đột phiên bản bằng cách loại trừ phiên bản không mong muốn khỏi sự phụ thuộc phù hợp. Ví dụ:

<dependency> 
    <groupId>org.jclouds.driver</groupId> 
    <artifactId>jclouds-sshj</artifactId> 
    <version>${jclouds.version}</version> 
    <exclusions> 
     <exclusion> 
     <groupId>com.sun.jersey</groupId> 
     <artifactId>jersey-core</artifactId> 
     </exclusion> 
    </exclusions> 
</dependency> 

Hoặc bạn thêm com.sun.jersey: jersey-core với phiên bản mong muốn vào phụ thuộc của bạn. Maven giải quyết phiên bản confilicts bằng cách hỗ trợ sự phụ thuộc gần nhất với gốc phụ thuộc.

+0

Tôi biết cách giải quyết vấn đề. Những gì tôi muốn là cho maven để cho tôi biết có một * tiềm năng * vấn đề để bắt đầu với. – whaley

4

@Clement P đã cung cấp cho bạn câu trả lời hoàn hảo. Tuy nhiên, lưu ý rằng nó có thể không đủ cho các dự án đa mô-đun.

Mục tiêu depedndencyconvergence của plugin thực thi biết cách phát hiện va chạm phụ thuộc transitive, nhưng xung đột có thể ẩn theo cách khác.

Giả sử bạn có một dự án đa mô-đun. Gốc là A và nó có 2 mô-đun phụ, B1 và ​​B2.

B1 tuyên bố một sự phụ thuộc vào vật a: b: c:1.1, trong khi B2 tuyên bố một sự phụ thuộc vào vật a: b: c:2,0

Trong trường hợp này, nếu cả hai các module được xây dựng và triển khai với các phụ thuộc của chúng - bạn sẽ có một va chạm, nhưng nó là một loại plugin thực thi không biết cách phát hiện.Vì dự án A không (không thể) phụ thuộc vào các mô đun con của nó.

Để khắc phục sự cố này trong tổ chức của chúng tôi, chúng tôi đã sử dụng plugin phụ thuộc: danh sách plugin và phân tích đầu ra theo cách thủ công.

Mô tả thô của quá trình: Đầu ra của việc chạy mục tiêu này là danh sách tất cả các phụ thuộc chuyển tiếp của tất cả các dự án trong hệ thống phân cấp dự án. Chúng tôi phân tích cú pháp kết quả đầu ra, sắp xếp các phụ thuộc và tìm kiếm chỉ cho các tạo tác khác với id phiên bản. Điều này đòi hỏi một số kịch bản trong CI env của bạn nhưng nó là cách duy nhất để có được bức tranh tổng thể.

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