Maven可以提供范围,是否具有传递性?

时间:2013-09-13 19:14:48

标签: maven dependencies

我有一个Ancestor依赖项依赖于提供的范围,我需要将该范围传播到依赖于我的项目的任何内容。

例如,假设我SomeProjectA取决于SomeLibraryB。我需要提供范围SomeLibraryB

目前要编译依赖SomeProjectA的任何内容,还必须设置SomeLibraryB。我宁愿传播那个范围,然后有任何项目依赖于我的项目的家属处理..

3 个答案:

答案 0 :(得分:20)

我不认为这是可能的。每个项目都应该自己声明提供的依赖项。传播该范围是错误的,因为您不会对部署所做的部署做出假设,因为您不负责部署。您图书馆的用户会这样做..

答案 1 :(得分:0)

简单的破解

这可以通过简单的破解来实现。

enter image description here

您可以在直接依赖项标签中排除SomeLibraryBSomeLibraryC

以下是您的SomeProjectA的依赖项标签。

   <dependency>
        <groupId>org.direct.dependency</groupId>
        <artifactId>SomeProjectA</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.some</groupId>
                <artifactId>SomeLibraryB</artifactId>
            </exclusion>
            <exclusion>
                <groupId>org.some</groupId>
                <artifactId>SomeLibraryC</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

但是,如果您具有此配置,则您的测试和编译其他验证将开始失败。因此,您可以使用 <scope>test</scope> 将直接依赖项置于那些库中。

    <dependency>
        <groupId>org.some</groupId>
        <artifactId>SomeLibraryB</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.some</groupId>
        <artifactId>SomeLibraryC</artifactId>
        <scope>test</scope>
    </dependency>

答案 2 :(得分:-3)

Maven documentation可以看出,提供的范围不会影响编译,而是影响运行时。通常,您只需要在打包项目的依赖关系中指定提供的范围,例如 war 类型的项目。因此,它不具有传递性并不重要。

换句话说,如果在没有明确指定其范围的情况下向jar项目添加依赖项,那么在编译期间将使该依赖项可用,因此依赖项的依赖项也是如此。如果您明确声明该依赖项已提供范围,则不会更改。