我有一个祖先依赖项,它具有所提供的依赖范围,我需要将该范围传播到依赖于我的项目的任何内容。
例如,说我有SomeProjectA
取决于SomeLibraryB
. 我需要范围SomeLibraryB
已提供。
目前要编译任何依赖的东西,SomeProjectA
还必须设置SomeLibraryB
已提供。我宁愿传播该范围,然后让任何依赖于我的项目处理我的项目的依赖项..
我有一个祖先依赖项,它具有所提供的依赖范围,我需要将该范围传播到依赖于我的项目的任何内容。
例如,说我有SomeProjectA
取决于SomeLibraryB
. 我需要范围SomeLibraryB
已提供。
目前要编译任何依赖的东西,SomeProjectA
还必须设置SomeLibraryB
已提供。我宁愿传播该范围,然后让任何依赖于我的项目处理我的项目的依赖项..
我不认为这是可能的。每个项目都应自行声明提供的依赖项。传播该范围是错误的,因为您会对部署做出假设,因为您不负责部署。您图书馆的用户会这样做..
这可以通过一个简单的 hack 来实现。
您可以排除SomeLibraryB
并SomeLibraryC
在您的直接依赖标签内。
下面是您的SomeProjectA
.
<dependency>
<groupId>org.direct.dependency</groupId>
<artifactId>SomeProjectA</artifactId>
<exclusions>
<exclusion>
<groupId>org.some</groupId>
<artifactId>SomeLibraryB</artifactId>
</exclusion>
<exclusion>
<groupId>org.some</groupId>
<artifactId>SomeLibraryC</artifactId>
</exclusion>
</exclusions>
</dependency>
但是如果你有这个配置,你的测试和编译其他验证将开始失败。因此,您可以使用<scope>test</scope>
.
<dependency>
<groupId>org.some</groupId>
<artifactId>SomeLibraryB</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.some</groupId>
<artifactId>SomeLibraryC</artifactId>
<scope>test</scope>
</dependency>
从Maven 文档中可以看出,提供的作用域不会影响编译,但会影响运行时。通常,您只需要在打包项目的依赖项中指定提供的范围,例如war类型的项目。出于这个原因,它不具有传递性通常并不重要。
换句话说,如果您在jar
没有明确指定其范围的情况下向项目添加依赖项,则该依赖项将在编译期间可用,该依赖项的依赖项也将可用。如果您随后显式声明该依赖项已提供范围,则这不会改变。