为什么maven只识别已安装的POM文件的依赖项?

时间:2011-05-04 00:44:50

标签: maven

我有一个Maven项目,其中一个子项目(A)想要依赖另一个使用“pom”包装的子项目(B)。

如果我以直截了当的方式执行此操作,其中A指定对<type>pom</type>的B的依赖关系,如果我执行“mvn install”,那么事情就会完美,但如果我在安装之前运行任何阶段,例如{{ 1}}或mvn compile,然后在尝试构建A时失败:它在存储库中查找B的pom,但找不到它。

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

对于我们构建的所有jar包装项目,似乎可以正常工作,将它们从存储库中取出,使用mvn package构建,并且Maven知道如何在源代码中找到所有依赖项并构建树管理而不诉诸存储库;但是对于pom打包的项目,它总是想要去存储库。

我在尝试理解这一点时学到了几件事:

  • Maven最佳做法鼓励您use pom-packaged projects to group dependencies,但在POM项目中增加了“mvn install”步骤
  • Maven lifecycle documentation说“一个纯粹的元数据项目(包装价值是pom)只会将目标与安装和部署阶段联系起来”;也许这就是为什么POM项目作为依赖目标是不可见的,除非我调用安装阶段?我尝试将编译器插件绑定到编译阶段,这似乎没有帮助。

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

2 个答案:

答案 0 :(得分:4)

对于POM项目的哪些生命周期阶段,哪个目标必然受到限制并不是一个纯粹的问题。如果是,那么绑定“包”目标将解决问题。

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

因此,构建构建类路径的代码必须管理几种情况,特别是:

  • extra-project jar依赖项,它在本地存储库中查找POM,处理其依赖项,并将POM的jar添加到类路径
  • extra-project pom依赖项,它在本地存储库中查找POM并处理其依赖项
  • 项目内jar依赖项,它在项目树中查找POM,处理其依赖项,并将该模块的target / classes文件夹添加到类路径
  • 项目内pom依赖项,由于某种原因,它不在项目树中查找POM,因此不处理它的依赖项。

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

我可以看到两个解决方案。一种是提交错误报告,或者更确切地说是改变行为的请求(因为它显然是有意的),也许只是针对多模块项目的项目内依赖性的情况。或者确实提出补丁。但由于这种行为是有意的,你可能会遭到拒绝。在最好的情况下,你需要等待很长时间。 (我会为你的错误报告投票 - 在不同的背景下,我被同样的行为所刺痛。)

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

答案 1 :(得分:0)

配置maven-install-plugin在编译阶段运行,并将相关的pom.xml复制到存储库,就Maven本身而言似乎完成了我想要的,尽管m2eclipse仍然不满意(它抛出“无法读取工件描述符”错误,没有对依赖于其他POM项目的pom.xml的其他描述。)