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

Can `mvn compile` be expected to work with multi-module Maven reactor builds?

mvn compile 能否与多模块 Maven 反应器构建一起工作?

我正在尝试使用 reactor/multi-module Maven 构建的项目。当mvn compile failed*的时候,项目熟悉的人告诉我需要mvn install,而不是mvn compile,因为它是反应堆构建。

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

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

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

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

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

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

资源Link:Maven Tips and Tricks: Advanced Reactor Options

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

中所示,并通过它与 Maven By Example 示例一起工作的事实证明。 mvn compilemvn test 可以使用 reactor 构建。

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

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

我已经 运行 解决了多模块项目的这个问题。例如,对于正常范围和 test 范围,我将有一个名为 base 的模块,每个其他模块都依赖该模块。测试范围依赖性在那里,所以我可以共享通用单元测试 类 和实用程序。

mvn compile 将在 test 范围的 deps 上失败,并显示类似 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 是可取的 - 避免陈旧的代码随处可见。过去,我实际上编写了创建 empty/fake jar 文件的脚本,以便 mvn dependency:build-classpath 之类的命令可以工作。

我不确定 Maven 是否能解决这个问题。在我的列表中查看 sbtgradle.