2

我有一个复杂的项目结构,如下所示:

- root (no pom)
     - parent(parent pom.xml)
     + project A (pom.xml)
     + project B (pom.xml)
     - project C (pom.xml)
         - subproject 1 (pom.xml)
         - subproject 2 (pom.xml)
     + project N (pom.xml)

我需要subproject 2使用 Bamboo 服务器构建。我使用 Bamboo 来签出subproject 2代码,但是当我运行它时mvn install,它会失败并显示“不可解析的父 POM”消息。

当所有代码都在一个位置时,构建运行良好。我不想在root级别上签出代码,因为我不想签出大量项目(在我的示例中,项目 A、B、N 和子项目 1)

我尝试检查父项目、项目 C/pom 和子项目 2 的代码 3 次,但代码被放置在彼此无关的单独目录中,因此那里没有太多帮助

PS我没有使用任何模块,尽管我确实尝试过使用模块并且没有任何区别。我没有发布实际的 POM,因为它们非常微不足道,基本上子 pom 具有parent元素,这就是所有关系。

所有上游项目都部署到本地和远程仓库

4

3 回答 3

2

mvn 将在三个地方查找依赖项,在本地文件系统的相对路径中,在本地机器上的 m2 存储库中缓存,或在外部存储库中。如果您将所有依赖项安装在竹子可以访问的存储库上,您的构建可能会工作。

为了测试这一点,在您的本地机器上,您可以从根目录执行 mvn install(将所有依赖项放在您机器上的 m2 repo 中),然后在单独的目录中检出 subproject2,然后 mvn install subproject2?

如果可行,那么子项目 2 的依赖项需要位于竹子可以访问的 maven 存储库中。在使用竹子进行 mvn install 之前,使用诸如artifactory之类的东西来部署它们。

于 2012-09-09T20:01:16.263 回答
1

我们有一个非常相似的项目结构,我刚刚验证了我能够创建一个 Jenkins 作业,该作业只检查等效项subproject1并使用mvn -U clean install. 我无法访问 Bamboo 实例,但 Jenkins 和 Bamboo 都只是在后台调用 Maven,所以这里应该没有区别。

正如您所提到的,另一个可行的选项是检出整个存储库(或包含根目录和所有模块的目录)并mvn -U clean install -pl subproject1 -am在父 POM 上运行。

为了帮助您解决这个问题,我们确实需要更多信息。 您在其中一条评论中提到“所有 [上游] 依赖项都已部署到 repo”。您是指您的本地存储库(即 .m2/repository)吗?您应该仔细检查该目录是否包含所有父 POM。您是否从代理(即 Artifactory/Nexus)解析所有工件?如果是这样,还要检查那里的 POM 是否可用。

您当前的结构图未显示 POM 的位置。我假设您已正确设置它,但我见过人们将子模块放在奇怪位置的情况,这可能会导致问题。POM的相对位置很重要(除非您进行了一些自定义)。您能否tree在根目录上运行并清理输出,以便我们准确知道您的 POM 彼此之间的关系?例如:

parentProject
|-- projectA
|   |-- pom.xml
|
|-- projectB
|   |-- pom.xml
|   |
|   |-- subProject1
|   |   |-- pom.xml
|   |    
|   |-- subProject2
|       |-- pom.xml
|
|-- pom.xml

最后,您能否导航到您尝试构建的子项目/模块并发布输出mvn help:effective-pom

于 2012-09-14T15:15:54.470 回答
0

每个 maven 模块都应该是自包含的,使用谈论 ../parent 的相关链接打破了这种设计。

尝试通过 GAV 属性显式定义父项,然后确保install在本地 maven 存储库中编辑这些 pom,您将能够构建子项目。

我们运行 15 个模块,构建了 3 个级别,这一切都是可能的。

您遇到的唯一问题是,当您升级版本时,您必须启动根 pom 文件的安装以引导解决过程。

于 2012-09-26T22:34:17.643 回答