2016-02-17 24 views
6

Trong dự án của tôi, tôi có openejb-core phụ thuộc với phạm vi provided. Tuy nhiên nó có sự phụ thuộc quá độ của slf4j và phạm vi của nó là compile (xem ảnh chụp màn hình). Tất cả các phụ thuộc transitive khác được cung cấp như mong đợi.Maven phụ thuộc transitive có phạm vi biên dịch trong khi khi phụ thuộc đã cung cấp phạm vi

Câu hỏi: Có lỗi hoặc tôi đang thiếu thứ gì đó không?

enter image description here

+0

là cùng một sự phụ thuộc cũng được giới thiệu quá mức bởi một phụ thuộc khác trong biên dịch phạm vi? –

+0

Không. Chỉ trong số này –

+0

Vâng, phạm vi được cung cấp cho dự án của bạn.Nhưng openejb-core có thể đã tuyên bố nó với phạm vi biên dịch và đó là lý do bạn có thể thấy nó như là biên dịch –

Trả lời

10

Trong một pom mẫu tôi đã thêm:

<dependencies> 
    <dependency> 
     <groupId>org.apache.openejb</groupId> 
     <artifactId>openejb-core</artifactId> 
     <version>4.7.0</version> 
     <scope>provided</scope> 
    </dependency> 
</dependencies> 

Sau đó chạy:

mvn dependency:tree -Dincludes=org.slf4j 

Đầu ra là:

[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ test-junit --- 
[INFO] com.sample:test-sample:jar:0.0.1-SNAPSHOT 
[INFO] \- org.apache.openejb:openejb-core:jar:4.7.0:provided 
[INFO] +- org.slf4j:slf4j-jdk14:jar:1.7.7:provided 
[INFO] \- org.slf4j:slf4j-api:jar:1.7.7:provided 

Như bạn có thể nhìn thấy Mav vi được kết hợp với số official documentation. Vấn đề từ ảnh chụp màn hình của bạn có thể là trên IDE của bạn.

Bảng là điểm then chốt về chủ đề này: enter image description here

Từ đó, chúng ta có thể thấy rằng những gì là transitively trong phạm vi compile hoặc runtime đi trong phạm vi cung cấp, những gì có trong phạm vi provided hoặc test được bỏ qua.

Tuy nhiên, nếu tôi thay đổi pom mẫu của tôi để:

<dependencies> 
    <dependency> 
     <groupId>org.apache.openejb</groupId> 
     <artifactId>openejb-core</artifactId> 
     <version>4.7.0</version> 
     <scope>provided</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     <version>1.7.7</version> 
    </dependency> 
</dependencies> 

Và chạy lại lệnh cây phụ thuộc, đầu ra là như sau:

[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ test-junit --- 
[INFO] com.sample:test-sample:jar:0.0.1-SNAPSHOT 
[INFO] +- org.apache.openejb:openejb-core:jar:4.7.0:provided 
[INFO] | \- org.slf4j:slf4j-jdk14:jar:1.7.7:provided 
[INFO] \- org.slf4j:slf4j-api:jar:1.7.7:compile 

Look bây giờ: nó không được đưa ra khi một đứa trẻ của sự phụ thuộc được cung cấp, nhưng ở cùng một mức độ.

Hãy tiếp tục.

Nếu trên mẫu của tôi pom tôi loại bỏ các sl4f-api phụ thuộc nhưng tôi thêm vào pom như sau:

<dependencyManagement> 
    <dependencies> 
     <dependency> 
      <groupId>org.slf4j</groupId> 
      <artifactId>slf4j-api</artifactId> 
      <version>1.7.7</version> 
      <scope>compile</scope> 
     </dependency> 
    </dependencies> 
</dependencyManagement> 

Và lại tái chạy lệnh cây phụ thuộc, cuối cùng tôi nhận được giống như ảnh chụp màn hình của bạn:

[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ test-junit --- 
[INFO] com.sample:test-sample:jar:0.0.1-SNAPSHOT 
[INFO] \- org.apache.openejb:openejb-core:jar:4.7.0:provided 
[INFO] +- org.slf4j:slf4j-jdk14:jar:1.7.7:provided 
[INFO] \- org.slf4j:slf4j-api:jar:1.7.7:compile 

Bingo: phần dependencyManagement là trọng phạm vi của sự phụ thuộc bắc cầu, ảnh hưởng cũng là hòa giải trên provided phạm vi. Đây không phải là một lỗi, nó là do thiết kế như trong phần này bạn xác định loại quản trị liên quan đến phụ thuộc của bạn. Biểu đồ trong trường hợp này cũng chính xác và không gây hiểu lầm, vì sự phụ thuộc chỉ được giới thiệu bởi openejb-core, sau đó bị ảnh hưởng bởi quyết định dependencyManagement để đặt sl4f-api trong phạm vi compile.

+0

Cảm ơn câu trả lời chi tiết. Nó có vẻ là trường hợp của dependencyManagement. Tôi đã không nhận thức được hành vi quạ như vậy –

+0

Cảm ơn câu trả lời chi tiết như vậy, đã xóa một vài điều cho tôi. –

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