2009-05-03 31 views
25

Dự án của tôi bao gồm tệp jar vì tệp được liệt kê là phụ thuộc chuyển tiếp.Maven: xóa một phụ thuộc duy nhất transitive

Tuy nhiên, tôi đã xác minh không chỉ rằng tôi không cần nó, nhưng nó gây ra vấn đề bởi vì một lớp bên trong các tệp jar đổ bóng vào một lớp tôi cần trong tệp jar khác.

Làm cách nào để loại bỏ một tệp jar khỏi phụ thuộc chuyển tiếp của tôi?

Trả lời

30

Bạn có thể loại trừ một sự phụ thuộc theo cách sau đây:

 <dependency> 
       <groupId>org.springframework</groupId> 
       <artifactId>spring</artifactId> 
       <version>2.5.6</version> 
       <exclusions> 
         <exclusion> 
           <groupId>commons-logging</groupId> 
           <artifactId>commons-logging</artifactId> 
         </exclusion> 
       </exclusions> 
     </dependency> 
3

Bạn có thể thực hiện việc này bằng cách loại trừ một cách rõ ràng các tạo phẩm có vấn đề. Lấy phụ thuộc bao gồm các vấn đề và đánh dấu nó được loại trừ:

Từ maven website:

<dependency> 
    <groupId>group-a</groupId> 
    <artifactId>artifact-a</artifactId> 
    <version>1.0</version> 
    <exclusions> 
    <exclusion> 
     <groupId>group-c</groupId> 
     <artifactId>excluded-artifact</artifactId> 
    </exclusion> 
    </exclusions> 
</dependency> 
15

Cách đúng là sử dụng cơ chế loại trừ, tuy nhiên đôi khi bạn có thể thích sử dụng bản hack sau để tránh thêm một số lượng lớn các loại trừ khi nhiều tạo phẩm có cùng một phụ thuộc chuyển tiếp mà bạn muốn bỏ qua. Thay vì chỉ định loại trừ, bạn xác định phụ thuộc bổ sung với phạm vi "được cung cấp". Điều này nói với Maven rằng bạn sẽ tự chăm sóc cung cấp vật phẩm này trong thời gian chạy và vì vậy nó sẽ không được đóng gói. Ví dụ:

<dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring</artifactId> 
      <version>2.5.6</version> 
    </dependency> 
    <dependency> 
      <groupId>commons-logging</groupId> 
      <artifactId>commons-logging</artifactId> 
      <version>1.1.1</version> 
      <scope>provided</scope> 
    </dependency> 

Side hiệu lực: bạn phải xác định một phiên bản của artifact-to-be-bỏ qua, và POM của nó sẽ được lấy ra ở xây dựng theo thời gian; đây không phải là trường hợp có loại trừ thông thường. Điều này có thể là một vấn đề đối với bạn nếu bạn chạy kho lưu trữ Maven riêng của mình phía sau tường lửa.

+0

Tôi đã cố gắng loại trừ servlet-api ra khỏi sự phụ thuộc của jar bằng phương pháp ole và điều đó không hiệu quả đối với tôi nhưng đã thử phương pháp này và nó đã thực hiện thủ thuật. Cảm ơn. – Aaron

+0

điều này làm việc cho tôi khi tôi phải loại trừ sự phụ thuộc dựa trên một . Cảm ơn! –

+0

Bạn cũng có thể sử dụng phạm vi _system_, nếu phụ thuộc của bạn được bao gồm trong JRE. Ví dụ với jaxb-api 2.0 và JRE 6. Xem [Maven System Dependencies] (http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#System_Dependencies) –

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