由提供的作用域和编译范围带来的传递依赖关系被计算为编译范围

时间:2019-03-13 16:39:36

标签: maven maven-3 maven-assembly-plugin

当具有{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文档,应该始终忽略

http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Scope

maven-3.6无法处理似乎是一个错误,真是可惜!

但是,由于我们的目标只是封装仅定义为编译/运行时的库(并忽略所有提供的库及其传递),因此如何使用依赖管理来实现此目的,或者在不可能的情况下使用maven-assembly-插件??

0 个答案:

没有答案