2015-02-04 14 views
12

Maven là transitively kéo trong phiên bản 16 của ổi, mặc dù tôi có một <dependencyManagement> phần trong đó xác định phiên bản 18.phiên bản Maven dependencyManagement bỏ qua trong sự phụ thuộc bắc cầu

Bản tóm tắt nhanh chóng:

  • gwizard-example phụ thuộc trên gwizard-config
  • gwizard-config có bố mẹ, gwizard-parent
  • gwizard-parent có <dependencyManagement> trong đó xác định phiên bản 18 của ổi

Rất may đây là một dự án mã nguồn mở, vì vậy bạn sẽ nhìn thấy poms trực tiếp: gwizard-parent, gwizard-config, gwizard-example. Tuy nhiên, đây là các bit quan trọng trong gwizard-parent:

<properties> 
    <guava.version>18.0</guava.version> 
</properties> 

<dependencyManagement> 
    <dependencies> 
     <dependency> 
      <groupId>com.google.guava</groupId> 
      <artifactId>guava</artifactId> 
      <version>${guava.version}</version> 
     </dependency> 
    </dependencies> 
</dependencyManagement> 

... và không rườm rà phụ thuộc khai báo trong gwizard-ví dụ:

<properties> 
    <gwizard.version>0.5</gwizard.version> 
</properties> 

<dependencies> 
    <dependency> 
     <groupId>org.gwizard</groupId> 
     <artifactId>gwizard-config</artifactId> 
     <version>${gwizard.version}</version> 
    </dependency> 
</dependencies> 

Cây phụ thuộc cho gwizard-config cho thấy ổi 18 một cách chính xác:

[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ gwizard-config --- 
[INFO] org.gwizard:gwizard-config:jar:0.5 
[INFO] +- com.google.inject:guice:jar:4.0-beta5:compile 
[INFO] | \- com.google.guava:guava:jar:18.0:compile 

Tuy nhiên, cây phụ thuộc cho gwizard-ví dụ cho thấy ổi 16 (mà gây ra vấn đề):

[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ gwizard-example --- 
[INFO] org.gwizard:gwizard-example:jar:1.0-SNAPSHOT 
[INFO] +- org.gwizard:gwizard-config:jar:0.5:compile 
[INFO] | +- com.google.inject:guice:jar:4.0-beta5:compile 
[INFO] | | \- com.google.guava:guava:jar:16.0.1:compile 

Điều này đang sử dụng Maven v3.2.5. Tôi bối rối. Cứu giúp?

Có thể liên quan: dependencyManagement in parent ignored

CẬP NHẬT: Các poms liên kết trên github đang thay đổi; thêm phụ thuộc vào gwizard-services (trực tiếp tuyên bố dep ổi) trong số gwizard-example "đã khắc phục" sự cố. Vẫn còn một số hành vi cơ bản xấu ở đây.

CẬP NHẬT: Tạo this JIRA issue

Trả lời

4

Có một điều đơn giản. A dependencyManagement không khai báo phụ thuộc là thực sự được sử dụng nó chỉ xác định phiên bản v.v. có thể được sử dụng.

Nếu bạn xác định một cái gì đó như thế này, nó sẽ không dẫn đến thay đổi.

<properties> 
    <guava.version>18.0</guava.version> 
</properties> 

<dependencyManagement> 
    <dependencies> 
     <dependency> 
      <groupId>com.google.guava</groupId> 
      <artifactId>guava</artifactId> 
      <version>${guava.version}</version> 
     </dependency> 
    </dependencies> 
</dependencyManagement> 

Nếu bạn thực sự muốn ghi đè lên các phiên bản được sử dụng trong bạn cây bạn cần phải xác định một sự phụ thuộc thực: Vì vậy, dựa trên định nghĩa ở trên, bạn cần phải thêm sau đây cũng như:

<dependencies> 
    <dependency> 
     <groupId>com.google.guava</groupId> 
     <artifactId>guava</artifactId> 
    </dependency> 
</dependencies> 

Nếu bạn đã thêm điều này, hãy kiểm tra sau đó qua mvn dependency:tree.

+4

Điều này không có ý nghĩa; hoặc ít nhất, nó không có vẻ rất hữu ích. Điểm của 'dependencyManagement' là cho phép tôi chỉ định một phiên bản cho các phụ thuộc transitive. Ở đây, ổi đang được kéo quá mức qua guice. Tại sao 'dependencyManagement' của tôi không kiểm soát phiên bản được lấy bởi guice? Tại sao tôi nên chỉ định ổi là phụ thuộc nếu thư viện của tôi không trực tiếp phụ thuộc vào ổi? – stickfigure

+1

Câu trả lời đơn giản cho điều này là, do người duy trì pom của guice đã quyết định sử dụng một phiên bản khác. Vì vậy, bạn không thể trực tiếp kiểm soát pom được sử dụng ở đó. Bạn chỉ có thể kiểm soát nó gián tiếp. BTW: 'dependencyManagement' không kiểm soát. 'phụ thuộc' thay vào đó, làm cho nó gần với dự án của bạn hơn. – khmarbaise

0

Maven không giải quyết vấn đề phụ thuộc transitive phiên bản trong trường hợp này.

Sự cố này có thể được sử dụng bằng cách sử dụng khái niệm bom maven.

Kiểm tra tài liệu maven cho bom trong link bên dưới http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Management

Dưới đây là một blog mà giải thích việc sử dụng bom của http://howtodoinjava.com/maven/maven-bom-bill-of-materials-dependency/

Trong trường hợp của bạn để giải quyết vấn đề này, bạn cần phải thêm phụ thuộc bên dưới trong phần dependencyManagement của dự án gwizard-example.

 <dependency> 
     <groupId>org.gwizard</groupId> 
     <artifactId>gwizard-parent</artifactId> 
     <version>${gwizard.version}</version> 
     <type>pom</type> 
     <scope>import</scope> 
    </dependency> 
+1

Điều này không có ý nghĩa; hoặc ít nhất, nó không có vẻ rất hữu ích. Điểm của dependencyManagement là _allow_me_to_specify_a_version_ cho các phụ thuộc transitive, không kế thừa phiên bản của dự án khác ... – Galigator

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