2011-05-04 39 views
6

我有一个Maven项目,其中一个子项目(A)想要依赖另一个使用“pom”包装的子项目(B)。为什么maven识别只有安装的POM文件的依赖关系?

如果我这样做了简单的方法,其中A指定与<type>pom</type>对B存在依赖关系,事情很好地工作,如果我做“MVN安装”,但如果我运行任何阶段早于安装,如mvn compilemvn package,然后它尝试构建A失败:它会在存储库中查找B的POM,并且找不到它。

我真的不想在存储库中使用这个pom,因为它是我们活动源代码的一部分,并且经常更改。

对于我们构建的所有jar打包项目,它似乎很好地将它们保存在存储库之外,使用mvn package构建,Maven知道如何在源代码中找到所有依赖项并构建它所管理的树,而无需执行到存储库;但是对于pom打包的项目,它总是希望访问存储库。

一对夫妇的事情,我学会了在试图理解这一点:

  • Maven的最佳做法,鼓励你use pom-packaged projects to group dependencies,但随着加踩POM项目“MVN安装”
  • Maven lifecycle documentation说:“一个纯粹是元数据的项目(包装价值是pom)只将目标绑定到安装和部署阶段“;也许这就是为什么POM项目作为依赖目标不可见的原因,除非我调用安装阶段?我尝试将编译器插件绑定到编译阶段,这似乎没有帮助。

有没有一种方法可以将POM子项目指定为同一父项目中另一个子项目的依赖项,而无需将POM项目安装到存储库?

回答

4

这并不纯粹是POM项目的哪些生命周期阶段必须遵守哪些目标的问题。如果是这样,那么绑定“一揽子”目标就能解决问题。

当构建一个多模块项目时,Maven读取所有模块的POM以确定模块之间的依赖关系,以便它可以在依赖模块之前构建依赖模块。即使在运行“包”目标时(即依赖模块尚未存放在本地存储库中),它也能实现这一目标。

因此,构建类路径构建必须要管理几起案件,特别是代码:

  • 额外项目JAR依赖,它会在本地存储库中的POM,处理它的依赖,并增加了POM的jar到classpath
  • 额外项目的pom的依赖,它看起来对POM在本地仓库,并处理它的依赖
  • 内项目JAR依赖,在那里寻找项目树中的POM,处理它的依赖关系,并将该模块的目标/类文件夹添加到cla sspath
  • intra-project pom dependency,其中由于某种原因,它不在项目树中查找POM,因此不处理它的依赖关系。

注意最后两种情况下的不对称性,与前两种情况相比。

我可以看到你的问题的两种解决方案。一个是提交一个错误报告,或者说是一个改变行为的请求(因为它显然是有意的),可能只是针对多模块项目的项目内依赖关系。或者确实提出一个补丁。但由于行为是故意的,您可能会遇到拒绝。在最好的情况下,你需要等待很长时间。 (我会为你的bug报告投票 - 我在不同的上下文中被同样的行为刺痛了。)

另一种解决方案是简单地在你的项目上运行安装。我不明白为什么你不想在存储库中使用POM项目:如果需要,可以使用快照存储库,如果情况经常变化,可以使用快照存储库,以避免污染主存储库。

+1

感谢您确认不对称性。我结束了第二个建议,如[我的答案](http://stackoverflow.com/questions/5877317/why-does-maven-recognize-dependencies-on-only-installed-pom-files/5877982#5877982 )。这并不是我反对将POM项目放入存储库,我只是不想要所有开发人员必须遵循的额外先决条件步骤。所以我很高兴如果我可以用“mvn package”构建整个项目,即使有些东西最终会在版本库中作为副作用。但我不想告诉人们先去其他地方运行“mvn install”。 – metamatt 2011-05-04 21:51:45

0

配置maven-install-plugin在编译阶段运行,并将相关pom.xml复制到存储库,似乎完成了我对Maven本身所想要的,尽管m2eclipse仍然不快乐(它抛出“无法读取工件描述符”错误,而没有对具有对另一个POM工程的依赖性的pom.xml的附加描述)。