2010-10-14 42 views
74

Dưới đây là vấn đề chung của tôi:Maven: làm thế nào để ghi đè lên phụ thuộc thêm vào một thư viện

dự án P My phụ thuộc vào A mà phụ thuộc vào B mà phụ thuộc vào C mà phụ thuộc vào phiên bản 1.0.1 của D.

Có sự cố với phiên bản 1.0.1 của D và tôi muốn buộc sử dụng mô-đun khác. Tôi không biết làm thế nào để tuyên bố điều này trong POMs của dự án của tôi kể từ khi tôi đã không được thêm một phụ thuộc vào D trực tiếp. Đó là C tuyên bố sự phụ thuộc vào D.

Quan trọng: Trong trường hợp này, không chỉ phiên bản được thay đổi, mà còn là thành phần nhóm &. Vì vậy, nó không chỉ là vấn đề ghi đè phiên bản của sự phụ thuộc, mà đúng hơn là loại trừ một mô-đun và bao gồm một mô-đun khác.

Trong trường hợp cụ thể, D là StAX có 1.0.1 có bug. Theo ghi chú trong lỗi, "các vấn đề đã được giải quyết bằng cách thay thế stax-api-1.0.1 (maven GroupId = stax) bởi stax-api-1.0-2 (maven GroupId = javax.xml.stream)" vì vậy tôi đang cố gắng điều đó.

Do đó, D = Stax: Stax-api: jar: 1.0.1 và C = org.apache.xmlbeans: XMLBeans: jar: 2.3.0

Tôi đang sử dụng maven 2.0.9 trong trường hợp nó vấn đề.

Sản lượng phụ thuộc mvn: cây"

mvn dependency:tree 
[..snip..] 
[INFO] +- org.apache.poi:poi-ooxml:jar:3.6:compile 
[INFO] | +- org.apache.poi:poi-ooxml-schemas:jar:3.6:compile 
[INFO] | | +- org.apache.xmlbeans:xmlbeans:jar:2.3.0:compile 
[INFO] | | | \- stax:stax-api:jar:1.0.1:compile 

Trong POM của dự án của tôi, tôi có sự phụ thuộc sau trên "A":.

<dependency> 
    <groupId>org.apache.poi</groupId> 
    <artifactId>poi</artifactId> 
    <version>3.6</version> 
</dependency> 
<dependency> 
    <groupId>org.apache.poi</groupId> 
    <artifactId>poi-ooxml</artifactId> 
    <version>3.6</version> 
</dependency> 

Cảm ơn trước

Trả lời

69

Đơn giản chỉ cần xác định trong phiên bản hiện tại của bạn. Phiên bản được chỉ định tại đây sẽ ghi đè lên phiên bản khác.

Buộc phiên bản
Phiên bản sẽ luôn được vinh danh nếu được khai báo trong POM hiện tại với phiên bản cụ thể - tuy nhiên, cần lưu ý rằng điều này cũng sẽ ảnh hưởng đến các poms khác ở hạ lưu nếu nó phụ thuộc vào việc sử dụng chuyển tiếp phụ thuộc.


Resources:

+3

không rõ cách tôi có thể chỉ định phiên bản vì tôi không khai báo phụ thuộc vào D. Ngoài ra, liên kết đầu tiên bạn cung cấp có "Tài liệu này mô tả các yêu cầu còn lại về quản lý phụ thuộc chưa được triển khai cho Maven 2.0, đặc biệt là liên quan đến phụ thuộc transitive. " ở trên cùng. – wishihadabettername

+0

@wishihadabettername, Như đã nói trong tài liệu khác: "Bạn rõ ràng có thể thêm phụ thuộc vào D 2.0 trong A để bắt buộc sử dụng D 2.0" –

+1

Bạn thực sự sao chép cùng một mục nhập rất giống trong pom của riêng bạn. Trong sự phụ thuộc của bạn, hãy chỉ định một số mà bạn muốn. Điều đó sẽ ghi đè lên bất kỳ phiên bản nào được sử dụng bởi các phụ thuộc "sâu hơn". –

16

Ngoài ra, bạn chỉ có thể loại trừ sự phụ thuộc mà bạn không muốn. STAX được bao gồm trong JDK 1.6, vì vậy nếu bạn đang sử dụng 1,6, bạn chỉ có thể loại trừ nó hoàn toàn.

Ví dụ của tôi dưới đây hơi sai đối với bạn - bạn chỉ cần một trong hai loại trừ nhưng tôi không chắc chắn một loại nào. Có những phiên bản khác của Stax nổi về, trong ví dụ của tôi dưới đây tôi đã nhập A mà nhập khẩu B nhập khẩu C & D mà mỗi (thông qua nhiều phụ thuộc transitive) nhập khẩu các phiên bản khác nhau của Stax. Vì vậy, trong sự phụ thuộc của tôi vào 'A', tôi loại trừ cả hai phiên bản của Stax.

<dependency> 
    <groupId>a.group</groupId> 
    <artifactId>a.artifact</artifactId> 
    <version>a.version</version> 
    <exclusions> 
    <!-- STAX comes with Java 1.6 --> 
    <exclusion> 
     <artifactId>stax-api</artifactId> 
     <groupId>javax.xml.stream</groupId> 
    </exclusion> 
    <exclusion> 
     <artifactId>stax-api</artifactId> 
     <groupId>stax</groupId> 
    </exclusion> 
    </exclusions> 
<dependency> 
+0

Cần lưu ý rằng phụ thuộc transitive này có thể được sử dụng và loại trừ có thể gây ra lỗi khi xây dựng nếu cần. –

+0

Nếu bạn đang sử dụng JDK hiện đại (nghĩa là 1.6+) và bạn cần phiên bản cũ hơn nhiều bao gồm thông qua một phụ thuộc chuyển tiếp, có thể bạn sẽ chạy vào tất cả các loại trình tải lớp thời gian chạy khủng khiếp. Lời khuyên của tôi: sử dụng một trong JDK. Nếu bạn nhận được một "xây dựng thất bại" bạn đang dựa vào một API cổ xưa của một số hình thức cần được nâng cấp. Hoặc: quay lại JDK của bạn xuống 1,5. Chúc may mắn với điều đó. – scot

3

Tôi cũng gặp khó khăn khi ghi đè phụ thuộc vào thư viện của bên thứ ba. Tôi đã sử dụng cách tiếp cận của scot với việc loại trừ nhưng tôi cũng đã thêm sự phụ thuộc với phiên bản mới hơn trong pom. (Tôi đã sử dụng Maven 3.3.3)

Vì vậy, cho ví dụ Stax nó sẽ trông như thế này:

<dependency> 
    <groupId>a.group</groupId> 
    <artifactId>a.artifact</artifactId> 
    <version>a.version</version> 
    <exclusions> 
    <!-- STAX comes with Java 1.6 --> 
    <exclusion> 
     <artifactId>stax-api</artifactId> 
     <groupId>javax.xml.stream</groupId> 
    </exclusion> 
    <exclusion> 
     <artifactId>stax-api</artifactId> 
     <groupId>stax</groupId> 
    </exclusion> 
    </exclusions> 
<dependency> 

<dependency> 
    <groupId>javax.xml.stream</groupId> 
    <artifactId>stax-api</artifactId> 
    <version>1.0-2</version> 
</dependency> 
0

gì bạn đặt bên trong thẻ </dependencies> của pom gốc sẽ được bao gồm bởi tất cả các module con của gốc pom. Nếu tất cả các mô-đun của bạn sử dụng sự phụ thuộc đó, đây là cách để đi.

Tuy nhiên, nếu chỉ có 3 trong số 10 mô-đun con của bạn sử dụng một số phụ thuộc, bạn không muốn phụ thuộc này được bao gồm trong tất cả các mô-đun con của bạn. Trong trường hợp đó, bạn chỉ có thể đặt sự phụ thuộc vào bên trong </dependencyManagement>. Điều này sẽ đảm bảo rằng bất kỳ mô-đun con nào cần sự phụ thuộc phải khai báo nó trong tệp pom của riêng chúng, nhưng chúng sẽ sử dụng cùng một phiên bản của sự phụ thuộc đó như được chỉ định trong thẻ </dependencyManagement> của bạn.

Bạn cũng có thể sử dụng </dependencyManagement> để sửa đổi phiên bản được sử dụng trong phụ thuộc chuyển tiếp, vì phiên bản được khai báo trong tệp pom cao nhất là phiên bản sẽ được sử dụng. Điều này có thể hữu ích nếu dự án của bạn A bao gồm một dự án bên ngoài B v1.0 bao gồm một dự án bên ngoài khác C v1.0. Đôi khi nó xảy ra rằng một vi phạm an ninh được tìm thấy trong dự án C v1.0 được sửa chữa trong v1.1, nhưng các nhà phát triển của B chậm để cập nhật dự án của họ để sử dụng v1.1 của C. Trong trường hợp đó, bạn có thể chỉ cần khai báo một sự phụ thuộc vào C v1.1 trong pom gốc của dự án của bạn bên trong `, và mọi thứ sẽ tốt (giả sử rằng B v1.0 sẽ vẫn có thể biên dịch với C v1.1).

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