使用 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 存储库中是 install
ed,您将能够构建子项目。
我们运行 15 个模块,构建 3 个级别,这一切皆有可能。
您遇到的唯一问题是,当您升级版本时,您将不得不开始安装根 pom 文件以促进解决过程。
【讨论】:
以上是关于使用 Bamboo 构建定义父 POM 的 Subversion/Maven 项目的主要内容,如果未能解决你的问题,请参考以下文章