为什么没有'提供' Maven依赖' transitive'?

时间:2016-01-20 15:52:26

标签: java eclipse maven jar

为什么Maven不继承提供的依赖项?

我的情况:
我有2个独立项目 A B 我没有自己的项目 A A B 使用一些相同的库:

  • 反射-0.9.9-RC1.jar
  • 番石榴11.0.2.jar
  • XML的API-1.0.b2.jar
  • 了Javassist-3.16.1-GA.jar
  • DOM4J-1.6.1.jar
  • jsr305-1.3.9.jar

我制作了项目 C ,这是项目 A 的插件,但也使用项目 B

项目 C pom.xml:

<dependencies>
    <dependency>
        <groupId>com.a</groupId>
        <artifactId>a</artifactId>
        <version>1.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>com.b</groupId>
        <artifactId>b</artifactId>
        <version>1.0</version>
        <scope>compile</scope>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.4.2</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

现在我想为项目 C 制作插件,但我不能。
如果我创建项目 D ,依赖项目 C
它不会继承项目 A 的依赖项。
如果我将范围设置为compile,但会将其设置为项目 C ,这是无用的并且会导致重复。

所以现在我必须为每个插件添加依赖 A B

  

编译 - 这是默认范围,如果未指定,则使用。编译依赖项在项目的所有类路径中都可用。此外,这些依赖项将传播到依赖项目。

     

提供 - 这很像compile,但表示您希望JDK或容器在运行时提供依赖性。例如,在为Java Enterprise Edition构建Web应用程序时,您可以将Servlet API和相关Java EE API的依赖关系设置为提供的范围,因为Web容器提供了这些类。此范围仅适用于编译和测试类路径,且不具有传递性。

为什么不呢?

1 个答案:

答案 0 :(得分:5)

有一个确切要求的开放式错误:MNG-2205。它目前在Maven版本3的积压中,但我不会满怀希望:它创建于2006年4月(!)。

引用Jason van Zyl from that bug report

  

我们不太可能改变所提供范围的行为,但可以创建一个新的“提供 - 传递”的范围。如果我们真的想要这个。改变现有范围的定义会有问题。

另外,引用Andrew Williams, still from that bug report

  

如果C想要使用Sybase JConnect,则必须将其声明为依赖项。 A可以在任何时候改变它的依赖关系并且&#34;打破&#34; C的假设。

     

使用未声明的依赖项是错误的。

这个问题没有更好的答案:文档在这个主题上非常明确:提供的依赖关系目前不具有传递性。它最初完成的原因可能是因为如果你打算使用它,你应该明确声明一个依赖。