当具有{strong>提供的范围的artifact-X
和具有{strong>默认值的另一个dependency-1
传递相同的dependency-2
时,我们会遇到一个问题(编译)范围。
artifact-X
将作为 compile 范围进行计算,而我们希望它由dependency-1
明确提供。
例如,dependency-1
pom包含:
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.7</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.1</version>
</dependency>
</dependencies>
dependency-2
pom包含:
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.8</version>
</dependency>
</dependencies>
装配项目pom包含:
<dependencies>
<!-- do not include dependencies already provided by module-1 at runtime -->
<dependency>
<groupId>com.company</groupId>
<artifactId>module-1</artifactId>
<version>1.0</version>
<scope>provided</scope>
</dependency>
<!-- get dependencies required by module-2 runtime -->
<dependency>
<groupId>com.company</groupId>
<artifactId>module-2</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
但是组装项目上的mvn dependency:tree
将输出:
[INFO] --- maven-dependency-plugin:3.1.0:tree (show-app-dependencies) @ module-3 ---
[INFO] com.company:module-3:pom:1.0
[INFO] +- com.company:module-1:jar:1.0:provided
[INFO] | +- org.apache.commons:commons-lang3:jar:3.7:compile
[INFO] | \- org.apache.commons:commons-collections4:jar:4.1:provided
[INFO] \- com.company:module-2:jar:1.0:compile
我们可以看到来自于dependency-1的工件commons-lang3:jar:3.7
现在位于编译范围内。请注意,我们在这里不使用任何<dependencyManagement>
。
这非常令人困惑,当dependency-1
运行时的类路径中有效提供dependency-2
时(例如,由应用程序服务器提供),会导致运行时类路径中的库重复。
此外,基于有关依赖项中介/作用域的Maven文档,应该始终忽略。
maven-3.6无法处理似乎是一个错误,真是可惜!
但是,由于我们的目标只是封装仅定义为编译/运行时的库(并忽略所有提供的库及其传递),因此如何使用依赖管理来实现此目的,或者在不可能的情况下使用maven-assembly-插件??