Maven存储库声明是否可传递



假设我有以下项目,一个库,它声明了一些第三方存储库,需要使用它来获取工件。

<project ...>
<groupId>com.mygroup</groupId>
<artifactId>library</artifactId>
<version>1.0.0</version>
<repositories>
<repository>
<id>some-id</id>
<url>https://some.repo.com</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.thirdparty</groupId>
<artifactId>used-at-compile-time</artifactId> <!-- like Lombok, say -->
<version>1.0.0</version>
<scope>provided</scope> <!-- so, not transitive -->
</dependency>
</dependencies>
</project>

然后我有一个完全独立的项目,它依赖于库

<project ...>
<groupId>com.mygroup</groupId>
<artifactId>some-app</artifactId>
<version>2.0.0</version>
<dependencies>
<dependency>
<groupId>com.mygroup</groupId>
<artifactId>library</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
</project>

Maven是否尝试在所有依赖项目中包含存储库定义?some-app会尝试访问https://some.repo.com吗?

我一直认为这并没有发生,但我开始看到构建失败与这种信念背道而驰。

如果是这样的话,最初看起来可能很方便,但如果回购是内部的,不能通过互联网公开访问呢?声明它的项目可能会将它用于一些编译时依赖项,就像我上面的例子一样。如果该repo被拖入,依赖项目可能会尝试访问其他非Maven Central依赖项所不能访问的存储库。

因此,我可以看到任何一种行为的正当理由,但就我所见,存储库的文档并没有以这样或那样的方式说明发生了什么,POM引用也没有。

存储库在其pom的上下文中具有上下文意识。来自com.mygroup:library的依赖项可以使用回购的centralsome-id。另一方面,来自com.mygroup:some-app的依赖项将仅使用central。当从命令行运行Maven时,您会看到它将尝试从中下载工件的存储库(如果第一个失败,它将转到下一个(。

在向Central发布时,有几个要求。然而,基于最后一段的存储库并没有被禁止,建议您不要使用它们。

你可能不想读这篇经典文章:为什么在你的POM中放置存储库是一个坏主意

最新更新