当前位置: 首页 > 知识库问答 >
问题:

为什么“提供”Maven依赖项不是“可传递的”?

吕征
2023-03-14

我的情况:
我有两个独立的项目A和B。
没有项目A。
A和B使用相同的库:

    < li >反射-0.9.9-RC1.jar < li >番石榴-11.0.2.jar < Li > XML-API-1.0 . B2 . jar < li>javassist-3.16.1-GA.jar < li>dom4j-1.6.1.jar < li>jsr305-1.3.9.jar

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

项目C.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的依赖性。
如果将范围设置为编译,它会继承,但这将使它隐藏到项目C中,这是无用的,并且会导致重复。

因此,现在我必须为我制作的每个插件添加对A和B的依赖性。

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

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

为什么不呢?

共有1个答案

滕令雪
2023-03-14

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

引用Jason van Zyl的错误报告:

我们不太可能改变所提供的作用域的行为,但如果我们真的想这样做,创建一个新的“提供可传递的”是可能的。改变现有作用域的定义会有问题。

同样,引用安德鲁·威廉姆斯(Andrew Williams)的话,仍出自该错误报告:

如果C想要使用Sybase JConnect,那么它必须将其声明为依赖项。a可以在任何时候改变它的依赖关系并“打破”C的这个假设。

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

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

 类似资料:
  • 这个问题将澄清什么是传递依赖,以及它在Maven中如何在非常高的级别上工作。 我的定义是:在依赖树中,比如-- 若C在B中有范围编译,那个么将B声明为A的依赖项就足以用Maven构建A。但是,如果C在B中提供了作用域,那么当Maven构建A时,除非A在其依赖项中声明C,否则该构建不会根据C自动编译A。 这是正确的吗?

  • 根据Maven完整参考中的图像,当直接依赖关系范围为“编译”并且传递依赖关系的范围为“提供”时,传递依赖关系将被忽略。 我的问题是,如果直接依赖类从我的项目的传递依赖编译中扩展一个类将失败,因为在编译时'javac'将从传递依赖中寻找由直接依赖扩展的类,并且不会在编译时类路径中找到它,因为maven忽略了它。 基本上这就是编译直接依赖时编译传递依赖范围而不是运行时的原因,为什么提供传递依赖范围时不

  • 当我有一个包含POM的项目时,例如: 但是我似乎弄错了,Internet上的Maven文档并没有帮助我解决这个问题。 有什么想法吗?

  • 我创建了一个简单的示例(名称实际上并不意味着什么): GradleMultiProject\core\src\main\java\core.java 堆芯建造

  • 主要内容:依赖传递,依赖范围,依赖范围对传递依赖的影响,依赖调节Maven 依赖传递是 Maven 的核心机制之一,它能够一定程度上简化 Maven 的依赖配置。本节我们将详细介绍依赖传递及其相关概念。 依赖传递 如下图所示,项目 A 依赖于项目 B,B 又依赖于项目 C,此时 B 是 A 的直接依赖,C 是 A 的间接依赖。 Maven 的依赖传递机制是指:不管 Maven 项目存在多少间接依赖,POM 中都只需要定义其直接依赖,不必定义任何间接依赖,Mav

  • 当我为我的项目运行“mvn dependency:tree”时,它会显示以下内容: 正如您在标记行中看到的,xml API具有“编译”作用域,因此它被打包到。战争档案。为什么会这样? 更有趣的是,它只在使用Java5时发生,对于Java6,依赖项显示为“test”。 Maven版本:3.0.4