我的情况:
我有2个独立项目 A 和 B
我没有自己的项目 A
A 和 B 使用一些相同的库:
我制作了项目 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 制作插件,但我不能。
如果我创建项目 D ,依赖项目 C ,
它不会继承项目 A 的依赖项。
如果我将范围设置为compile
,但会将其设置为项目 C ,这是无用的并且会导致重复。
所以现在我必须为每个插件添加依赖 A 和 B 。
编译 - 这是默认范围,如果未指定,则使用。编译依赖项在项目的所有类路径中都可用。此外,这些依赖项将传播到依赖项目。
提供 - 这很像compile,但表示您希望JDK或容器在运行时提供依赖性。例如,在为Java Enterprise Edition构建Web应用程序时,您可以将Servlet API和相关Java EE API的依赖关系设置为提供的范围,因为Web容器提供了这些类。此范围仅适用于编译和测试类路径,且不具有传递性。
为什么不呢?
答案 0 :(得分:5)
有一个确切要求的开放式错误:MNG-2205。它目前在Maven版本3的积压中,但我不会满怀希望:它创建于2006年4月(!)。
引用Jason van Zyl from that bug report:
我们不太可能改变所提供范围的行为,但可以创建一个新的“提供 - 传递”的范围。如果我们真的想要这个。改变现有范围的定义会有问题。
另外,引用Andrew Williams, still from that bug report:
如果C想要使用Sybase JConnect,则必须将其声明为依赖项。 A可以在任何时候改变它的依赖关系并且&#34;打破&#34; C的假设。
使用未声明的依赖项是错误的。
这个问题没有更好的答案:文档在这个主题上非常明确:提供的依赖关系目前不具有传递性。它最初完成的原因可能是因为如果你打算使用它,你应该明确声明一个依赖。