我有一个复杂的项目结构,如下所示:
- 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次,但代码被放在不同的目录中,彼此没有关系,所以没有太多的帮助
P.S。
我没有使用模块,虽然我确实尝试过使用模块,但没有任何区别。我没有发布实际的POM,因为这些非常简单,基本上孩子pom有parent
元素,这就是所有关系。
所有上游项目都部署到本地和远程回购
答案 0 :(得分:2)
mvn将在三个位置查找依赖项,在本地文件系统上的相对路径中,在本地计算机上的m2 repo中缓存,或在外部存储库中查找。如果你在Bamboo可以访问的repo上安装所有依赖项,那么你的构建可能会有效。
要测试这一点,在本地计算机上,您可以从根目录执行mvn安装(将所有依赖项放在计算机上的m2 repo中),然后在单独的目录中检出子项目2,然后安装子项目2吗?
如果可行,那么子项目2的依赖关系需要在竹子可以访问的maven仓库中。在使用bamboo进行mvn安装之前,使用类似artifactory的部署来部署它们。
答案 1 :(得分:1)
我们有一个非常相似的项目结构,我刚刚验证了我能够创建一个只检查subproject1
的等效项并使用mvn -U clean install
构建它的Jenkins作业。我没有访问Bamboo实例的权限,但Jenkins和Bamboo都只是在引擎盖下调用Maven,所以这里应该没有区别。
正如您所提到的,其他选项是检出整个存储库(或包含root和所有模块的目录)并在父POM上运行mvn -U clean install -pl subproject1 -am
。
为了帮助您,我们确实需要更多信息。您在其中一条评论中提到“所有[上游]依赖关系已经部署到了repo”。你的意思是你的本地存储库(即.m2 /存储库)?您应该仔细检查此目录是否包含所有父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
的输出?
答案 2 :(得分:0)
每个maven模块都应该是自包含的,使用相关链接来讨论../parent打破了这种设计。
尝试并通过GAV属性明确定义父项,然后确保这些poms在您的本地maven仓库中install
,您将能够构建子项目。
我们运行15个模块构建3个级别,这是可能的。
你唯一的问题是当你碰到版本时,你将不得不开始安装根pom文件来提升分辨率过程。