【问题标题】:Can `mvn compile` be expected to work with multi-module Maven reactor builds?可以期望“mvn compile”与多模块 Maven 反应器构建一起使用吗?
【发布时间】:2018-05-23 00:22:19
【问题描述】:

mvn compile 可以与多模块 Maven 反应器构建一起使用吗?

我正在尝试开发一个使用反应器/多模块 Maven 构建的项目。当mvn compile 失败* 时,熟悉该项目的人告诉我需要mvn install,而不是mvn compile,因为它是一个反应堆构建。

虽然mvn install 确实有效,因为 Maven 然后可以将构建依赖项从本地存储库中拉出,但我认为我必须发布到存储库似乎是错误的,因为这样做会产生问题,尤其是在 CI 环境中。

但是,我能找到的围绕多模块项目的几乎所有示例都使用mvn clean install,包括Maven by Example。我没有找到可以归因于多模块项目的 mvn compile 示例,这让我倾向于认为这里存在 Maven 限制/要求。

我注意到 mvn compile 在 Maven by Example 中提供的示例确实为我工作,但这是一个相对简单的项目,所以我知道我不能认为它应该一般工作。

* 它失败是因为它找不到在 reactor 构建之前成功构建的依赖项之一。

【问题讨论】:

  • 你用的是哪个版本的maven?
  • Apache Maven 3.5.2
  • 据我所知,maven 需要将构建的工件放入本地 repo 以便能够找到它,如果它被用作其他项目的依赖项,即使是多模块项目。我不确定您为什么不希望工件出现在本地存储库中?
  • @tsolakp 考虑一个 CI 服务器,机器本地意味着该服务器上的所有构建都是全局的。通过执行install,一个构建的编译工件对另一个构建可见。这意味着配置错误的构建可能会错误地成功,因为它可能会从本地存储库中提取依赖项。或者,由于来自构建的本地 repo 副本与预期的远程发布的依赖项之间的差异,另一个构建可能会在它应该通过时失败。
  • 多模块项目通常使用mvn clean package构建。仅当任何其他项目(与反应器中的模块无关)将使用一个或多个已构建项目作为依赖项时,才需要安装...

标签: java maven maven-reactor


【解决方案1】:

我在多模块项目中遇到过这个问题。例如,我将有一个名为 base 的模块,其他所有模块都依赖它,既适用于正常范围,也适用于 test 范围。存在测试范围依赖项,因此我可以共享通用单元测试类和实用程序。

mvn compile 将在 test 范围的部门上失败,并显示类似 Could not resolve dependencies for project com.example:zydeco:jar:0.0.1: Failure to find com.example:base:jar:tests:0.0.1 的消息

但是使用mvn test -Dmaven.test.skip.exec=true,这在精神上 和compile一样,它会发现解决所有项目内的测试依赖就好了。

如果我运行mvn dependency:tree 之类的东西,它会因常规依赖而失败,并显示Could not resolve dependencies for project com.example:zydeco:jar:0.0.1: Failure to find com.example:base:jar:0.0.1 之类的消息

我同意其他人的看法,即避免使用 packageinstall 是可取的 - 以避免出现陈旧的代码。过去,我实际上编写了创建空/假 jar 文件的脚本,以便 像mvn dependency:build-classpath 这样的命令可以工作。

我不确定 maven 是否可以解决这个问题。 sbtgradle 在我的名单上。

【讨论】:

    【解决方案2】:

    @khmarbaise's comment 中所示,并通过它与 Maven By Example 示例一起工作的事实证明了这一点。 mvn compilemvn test 可以与反应堆构建一起使用。

    但是,并非所有插件都适用于这种方法。例如,making test-jar's work can require changing the phase

    按照@khmarbaise 的建议使用mvn package 可能会减少这些问题,同时还可以避免使用mvn installmvn deploy 引起的问题。

    【讨论】:

      【解决方案3】:

      如果您的多模块项目相互依赖,那么您至少需要将这些依赖项 install 到您的本地存储库,然后才能编译其他项目,这实际上是非常合乎逻辑的。

      【讨论】:

      • Maven 识别出它只是构建了一个组件并使用刚刚构建的版本难道不合逻辑吗?
      • 并非如此。 Maven 分离关注点。因此,如果一个模块 (A) 依赖于另一个模块 (B)。这个其他模块 (B) 需要可供模块 (A) 编译...
      • 这就是为什么反应堆会发现 B 需要先构建并在 A 之前构建它。
      • 安装用于构建不需要的多模块。只有mvn clean package。如果确实需要它而不是您的多模块构建被破坏(缺少模块间依赖关系)......
      【解决方案4】:

      您可以使用--also-make-dependents 选项。它配置 Maven 来构建项目及其依赖项。实际上,该命令检查 reactor 中的所有项目以查找依赖于特定项目的项目。它会自动构建这些项目,而不是其他任何东西。

      $ mvn --projects your-sample-project --also-make-dependents install
      

      资源链接:Maven Tips and Tricks: Advanced Reactor Options

      【讨论】:

      • 那仍然使用install而不是compile,所以我不确定得到了什么
      • 来自文档,mvn install - 此命令在执行安装之前按顺序执行每个默认生命周期阶段(验证、编译、打包等)。
      • 我的问题是我不想执行安装。
      • 实际上你正在混合普通的maven项目和多模块项目。 .而在 reactor[Reactor 负责对组件进行排序,以确保以正确的顺序编译和安装相互依赖的模块。] 请通过:Guide to Working with Multiple Modules
      • 您是说配置了某些东西,使其成为混合构建,因此compile 不起作用,否则它会起作用?除非我缺少导航,否则您链接的指南只是一个似乎无法回答问题的页面。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      • 2019-07-11
      • 1970-01-01
      • 1970-01-01
      • 2014-03-23
      相关资源
      最近更新 更多