使用 Bamboo 构建定义父 POM 的 Subversion/Maven 项目

Posted

技术标签:

【中文标题】使用 Bamboo 构建定义父 POM 的 Subversion/Maven 项目【英文标题】:Using Bamboo to build Subversion/Maven project that defines parent POM(s) 【发布时间】:2012-09-06 23:24:29 【问题描述】:

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

- 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)

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

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

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

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

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

【问题讨论】:

这是一个多模块构建,在项目-A、子项目 1 等中使用父级吗? 并非如此 - 这仅限于指向父 pom 的子 pom。就我而言,它是 sub2.pom->projC.pm->../parent.pom 您的其他项目(例如 A 和 sub 1)是否已经在其他地方构建? 是的,其他项目已经部署到maven了 您的问题可能是 Bamboo 中的设置限制它为每个项目使用私有存储库。我知道这在 Jenkins/hudson 中是可能的,并且可以破坏这样的事情.. 【参考方案1】:

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

要对此进行测试,在您的本地机器上,您能否从根目录执行 mvn install(将所有依赖项放在您机器上的 m2 repo 中),然后在单独的目录中检出 subproject2,然后 mvn install subproject2?

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

【讨论】:

“整棵树”是什么意思?在我的本地机器上,我可以毫无问题地构建这个项目。我认为 Bamboo 的问题在于它将 3 个项目拉入不相关的单独目录中,然后在构建开始时找不到父 POM 重申一下 - 所有向上的依赖项都已经部署到 repo,但是当 Bamboo 尝试在子项目上执行“mvn install”时它抱怨缺少父依赖项 你能发布 pom 和确切的错误信息吗?更好的是发布有效的pom。如果一切都可以解决,构建一个子模块应该可以工作。 说没有子模块。我有一个子 pom 引用了一个父 pom,而它又引用了一个全局父 pom 实际上即使在父项目中添加模块也无法修复它。尝试从子级别构建时,我仍然收到相同的错误:“Non-resolvable parent POM”【参考方案2】:

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

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

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

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

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

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

【讨论】:

在我的(原始)图中,每个节点(和叶)都包含 pom.xml。最顶层没有 pom.xml,正如您所见,与 A 和 B 在同一级别上存在“父”目录,并且从 A、B、C...N 中,它被称为“../parent”。所有上游项目都部署在本地和远程仓库中【参考方案3】:

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

尝试通过 GAV 属性明确定义父级,然后确保这些 pom 在您的本地 maven 存储库中是 installed,您将能够构建子项目。

我们运行 15 个模块,构建 3 个级别,这一切皆有可能。

您遇到的唯一问题是,当您升级版本时,您将不得不开始安装根 pom 文件以促进解决过程。

【讨论】:

以上是关于使用 Bamboo 构建定义父 POM 的 Subversion/Maven 项目的主要内容,如果未能解决你的问题,请参考以下文章

将参数传递给 Bamboo 中的构建

Bamboo - SonarQube 多模块 maven 项目跳过子模块

Maven从错误的存储库下载[关闭]

Bamboo 自定义部署-项目变量

具有不应继承的定义的父 pom

Bamboo 构建计划与自定义环境配置的部署计划