如果父POM中配置了repositories,我的POM如何找到父POM?

27

我已将所有仓库配置从我的各个项目中重构到了一个父POM中,这个父POM是我为了像仓库和分发管理这样的单点配置而创建的。据我所知,这应该是最佳实践。我将我的父POM部署到Nexus服务器上,然后尝试运行我的子项目。它们找不到我的父POM……这对我来说似乎很合理,因为没有了父POM,它们就不知道Nexus仓库……这似乎是一种先有鸡还是先有蛋的问题?我是否忽略了一些明显的东西?

2个回答

13

确实,你的项目需要知道在哪里找到存储库以下载其依赖项。但是,在访问外部存储库之前,Maven会检查本地存储库,以查看它需要的构件是否存在其中。你的本地存储库中包含父POM吗?如果没有,可以通过运行以下命令来添加:

mvn install

在父POM文件上。问题可能是由于直接将父POM文件部署到Nexus而绕过本地POM文件所造成的。您可以通过使用以下方式来避免这种情况:

mvn deploy
这将首先在本地安装该工件,然后将其部署到外部仓库(在您的情况下为Nexus)。更多细节请参见:http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html 如果您的父POM由其他人构建和部署,则此方法无效。您可以在项目的POM或本地settings.xml中指定存储库。一种常见方法是期望所有开发人员在其本地settings.xml中包含对您的Nexus存储库的存储库定义,并将其用作所有其他存储库的镜像。然后,您可以在Nexus中配置所需的每个外部存储库,并让它为您检索所需的任何依赖项。我不熟悉Nexus,但有关镜像的更多详细信息,请参见:http://maven.apache.org/guides/mini/guide-mirror-settings.html

谢谢,这很有帮助。 我希望能找到一种解决方案,使开发人员可以简单地检出项目,构建和所有内容都能正常工作。这个“设计原则”使settings.xml有些烦人,但并不糟糕;) 问题在于,父POM在scm结构中位于许多项目之上。 特定proj上的开发人员不想在父pom的高度检出...也许需要一些scm技巧。 - chad
当然,我自己也遇到了这个问题。在Maven中,可以将父pom文件放在其他地方,而不是在svn树的顶部,并在另一个pom文件中定义子模块,该文件位于顶部。 Maven中的父子关系有两个方面; 定义父项允许配置继承,并且定义模块允许构建聚合。 但是,这两个方面不必一起处理 - 您可以将父项目放在其他位置,并在svn树的顶部使用新的pom文件,以便可以单独检出和构建父项。 - Conan

10

您需要为每个子模块(Maven模块)维护仓库定义,这是构建过程中的最佳实践:“使构建可移植”。

任何开发人员/系统都应该能够在没有与父模块或其他模块的源依赖关系的情况下,只使用仓库引用来构建任何模块。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接