为什么没有"提供"Maven依赖"传递"?

Mys*_*yst 4 java eclipse jar maven

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

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

  • 反射-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

我做的项目Ç,这是项目的一个插件一个,而且还采用了项目.

Project 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>
Run Code Online (Sandbox Code Playgroud)

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

所以现在我必须使用我制作的每个插件为AB添加依赖.

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

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

为什么不?

Tun*_*aki 5

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

引用Jason van Zyl的错误报告:

我们不太可能改变所提供范围的行为,但如果我们真的想要这样做,就有可能创建一个新的"提供传递".改变现有范围的定义会有问题.

此外,引用安德鲁·威廉姆斯,仍然从那个错误报告:

如果C想要使用Sybase JConnect,则必须将其声明为依赖项.A可以在任何时候改变它的依赖性并"打破"这种C的假设.

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

这个问题没有更好的答案:关于这个主题的文档很清楚:提供的依赖关系目前不具有传递性.最初这样做的原因可能是因为如果你打算使用它,你应该明确声明一个依赖.