【问题标题】:Why aren't 'provided' Maven dependencies 'transitive'?为什么“提供”的 Maven 依赖项不是“传递的”?
【发布时间】:2016-04-26 13:34:14
【问题描述】:

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

我的情况:
我有 2 个独立的项目 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 的依赖。

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

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

为什么不呢?

【问题讨论】:

  • 嗯...抱歉这么说是因为它是按原样定义的...您期望得到什么答案?提供的依赖项不是传递的,因为这会破坏提供的依赖项的想法......正如你已经引用了文档......可能我在这里误解了你的问题......?
  • 如果是这样,这是否意味着没有办法添加传递依赖但不能在 jar 中对其进行遮蔽?
  • 这是一个完全不同的问题。
  • 没错,但在我的情况下这是下一个。我会想办法解决的。

标签: java eclipse maven jar


【解决方案1】:

对于该确切要求存在一个未解决的错误:MNG-2205。它目前在 Maven 第 3 版的积压中,但我不会让你抱有希望:它是在 2006 年 4 月创建的(!)。

引用Jason van Zyl from that bug report:

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

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

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

使用没有声明的依赖是错误的。

这个问题没有更好的答案:文档在这个主题上非常清楚:提供的依赖关系目前不是传递的。最初这样做的原因可能围绕着这样一个事实,即如果您打算使用它,您应该明确声明一个依赖项。

【讨论】:

  • 太棒了!还在等你来找我。
  • MNG-2205 已同时关闭:不会修复。所以这本书已经关闭了。
猜你喜欢
  • 2017-06-03
  • 2018-07-30
  • 1970-01-01
  • 2018-05-19
  • 2016-02-23
  • 2013-02-17
  • 2015-04-13
  • 2016-05-28
  • 1970-01-01
相关资源
最近更新 更多