为什么“provided”范围的Maven依赖不是“传递性”的?

4

为什么Maven不继承provided依赖项?

我的情况:
我有两个独立的项目AB
我不拥有项目A
AB使用了一些相同的库:

  • reflections-0.9.9-RC1.jar
  • guava-11.0.2.jar
  • xml-apis-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创建插件,但我无法做到。
如果我创建一个依赖于项目C的项目D
它不会继承依赖于项目A的依赖项。
如果我将范围设置为compile,它会被遮蔽到项目C中,这是没有用处的,并且会导致重复。

所以现在我必须为我制作的每个插件都添加对AB的依赖。

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

Provided-这与compile非常相似,但表示您期望JDK或容器在运行时提供依赖项。例如,在为Java Enterprise Edition构建Web应用程序时,您将把依赖项设置为提供的范围,因为Web容器提供了这些类。此范围仅在编译和测试类路径上可用,并且不是传递性的。

为什么呢?


1
抱歉要说,那是因为它被定义为这样...你期望得到什么答案?提供的依赖关系不是可传递的,因为这会破坏提供依赖关系的概念...正如你已经引用了文档...也许我在这里误解了你的问题...? - khmarbaise
如果是这样,那是否意味着没有办法添加一个传递性依赖但不将其打包到jar中? - Myst
2
那是一个完全不同的问题。 - Tunaki
没错,但在我这种情况下,这是下一步。我会尝试想出解决办法。 - Myst
1个回答

5
有一个针对该要求的开放性错误:MNG-2205。它目前在Maven 3版本的待办事项中,但我不会让你抱太大希望:它是在2006年4月创建的!引用Jason van Zyl的评论

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

此外,引用Andrew Williams的评论:

如果C想要使用Sybase JConnect,则必须将其声明为依赖项。A随时可以更改其依赖关系并“破坏”C的这种假设。

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

对于这个问题没有更好的答案:文档在这个问题上非常清楚:提供的依赖项目前不是传递性的。最初这样做的原因可能与您应该明确声明要使用的依赖关系有关。

太好了!我还在等着你联系我。 - Michael-O
MNG-2205已经被关闭,同时标记为“不予修复”。因此,这本书已经关闭。 - Jan Galinski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接