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:
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
.
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? –
Không. Chỉ trong số này –
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 –