我有一个Maven项目,其中一个子项目(A)想要依赖另一个使用“pom”包装的子项目(B)。
如果我以直截了当的方式执行此操作,其中A指定对<type>pom</type>
的B的依赖关系,如果我执行“mvn install”,那么事情就会完美,但如果我在安装之前运行任何阶段,例如{{ 1}}或mvn compile
,然后在尝试构建A时失败:它在存储库中查找B的pom,但找不到它。
我真的不希望这个pom存储在存储库中,因为它是我们活动源代码的一部分并经常更改。
对于我们构建的所有jar包装项目,似乎可以正常工作,将它们从存储库中取出,使用mvn package
构建,并且Maven知道如何在源代码中找到所有依赖项并构建树管理而不诉诸存储库;但是对于pom打包的项目,它总是想要去存储库。
我在尝试理解这一点时学到了几件事:
有没有办法可以将POM子项目指定为同一父项目中另一个子项目的依赖项,而无需将POM项目安装到存储库?
答案 0 :(得分:4)
对于POM项目的哪些生命周期阶段,哪个目标必然受到限制并不是一个纯粹的问题。如果是,那么绑定“包”目标将解决问题。
在构建多模块项目时,Maven读取所有模块的POM以确定模块之间的依赖关系,以便它可以在依赖模块之前构建依赖模块。即使在运行“包”目标时也能实现这一目标(这样,所依赖的模块还没有在本地存储库中)。
因此,构建构建类路径的代码必须管理几种情况,特别是:
注意最后两种情况的不对称性,与前两种情况相比。
我可以看到两个解决方案。一种是提交错误报告,或者更确切地说是改变行为的请求(因为它显然是有意的),也许只是针对多模块项目的项目内依赖性的情况。或者确实提出补丁。但由于这种行为是有意的,你可能会遭到拒绝。在最好的情况下,你需要等待很长时间。 (我会为你的错误报告投票 - 在不同的背景下,我被同样的行为所刺痛。)
另一个解决方案就是在您的项目上运行安装。我真的不明白为什么你不想要你的存储库中的POM项目:如果需要,你可以使用快照存储库,如果事情经常变化无关紧要,以避免污染你的主存储库。
答案 1 :(得分:0)
配置maven-install-plugin在编译阶段运行,并将相关的pom.xml复制到存储库,就Maven本身而言似乎完成了我想要的,尽管m2eclipse仍然不满意(它抛出“无法读取工件描述符”错误,没有对依赖于其他POM项目的pom.xml的其他描述。)