【问题标题】:Why does maven recognize dependencies on only installed POM files?为什么 maven 只识别已安装的 POM 文件的依赖关系?
【发布时间】:2011-05-04 00:44:50
【问题描述】:

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

如果我以直接的方式执行此操作,其中 A 使用 <type>pom</type> 指定对 B 的依赖,如果我执行“mvn install”,则一切正常,但如果我在安装之前运行任何阶段,例如 mvn compilemvn package,然后它在尝试构建 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 项目安装到存储库?

【问题讨论】:

    标签: maven


    【解决方案1】:

    这不仅仅是 POM 项目的哪些目标与哪些生命周期阶段绑定的问题。如果是,那么绑定“包”目标就可以解决问题。

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

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

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

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

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

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

    【讨论】:

    • 感谢您确认不对称。我最终接受了您的第二个建议,如my answer。我并不反对将 POM 项目放入存储库中,我只是不希望我们所有的开发人员都必须遵循额外的先决条件步骤。因此,如果我可以使用“mvn package”构建整个项目,我会很高兴,即使某些东西最终会作为副作用出现在存储库中。但我不想告诉人们先在其他地方运行“mvn install”。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-17
      • 2012-03-03
      • 2016-12-13
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多