【发布时间】:2016-04-26 13:34:14
【问题描述】:
为什么 Maven 不继承提供的依赖项?
我的情况:
我有 2 个独立的项目 A 和 B。
我没有项目 A。
A 和 B 使用一些相同的库:
- 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 中,这无用并且会导致重复。
所以现在我必须为我制作的每个插件添加对 A 和 B 的依赖。
编译 - 这是默认范围,如果未指定则使用。编译依赖项在项目的所有类路径中都可用。此外,这些依赖项会传播到相关项目。
Provided - 这很像 compile,但表示您希望 JDK 或容器在运行时提供依赖项。例如,在为 Java Enterprise Edition 构建 Web 应用程序时,您可以将 Servlet API 和相关 Java EE API 的依赖设置为提供的范围,因为 Web 容器提供了这些类。此范围仅在编译和测试类路径上可用,不可传递。
为什么不呢?
【问题讨论】:
-
嗯...抱歉这么说是因为它是按原样定义的...您期望得到什么答案?提供的依赖项不是传递的,因为这会破坏提供的依赖项的想法......正如你已经引用了文档......可能我在这里误解了你的问题......?
-
如果是这样,这是否意味着没有办法添加传递依赖但不能在 jar 中对其进行遮蔽?
-
这是一个完全不同的问题。
-
没错,但在我的情况下这是下一个。我会想办法解决的。