【问题标题】:Does Maven support incremental builds?Maven 支持增量构建吗?
【发布时间】:2012-02-13 15:30:49
【问题描述】:

如何使用 Maven 来支持增量构建?哪里有导游? (谷歌搜索结果令人失望)

【问题讨论】:

  • 试试 Bing -“增量 Maven 构建” - 它给了我这个非常好的 - blog on incremental build plugin
  • 但它不提供“增量测试”的功能,所有模块的测试都会运行,即使构建是增量发生的。

标签: java maven


【解决方案1】:

我不太清楚驱动 Maven 社区的动力,但它对对构建过程进行细粒度控制并不友好。

无论如何,在四处挖掘之后,我在这里找到了一个适合我的答案:http://www.codesenior.com/en/tutorial/Java-Maven-Compile-Only-Changed-Files

请注意,将值设置为 false 一开始让我很困惑,但这里给出了解释:https://stackoverflow.com/a/19653164/409638

为方便起见,在此转载:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.2</version>
    <configuration>
        <source>1.6</source>
        <target>1.6</target>
        <useIncrementalCompilation>false</useIncrementalCompilation>
    </configuration>
</plugin>

这里的关键是将useIncrementalCompilation 设置为false

我可以确认,当我运行我的构建时,我已经离开了:

[INFO] Changes detected - recompiling the module!
[INFO] Compiling 114 source files to /home/vagrant/workspace/splat/target/classes

[INFO] Compiling 1 source file to /home/vagrant/workspace/splat/target/classes

这使我的增量构建减少了几秒钟。现在我要做的就是弄清楚如何禁用所有其他会减慢我的编辑/评估周期的不必要的杂物......

【讨论】:

  • 要禁用所有其他不必要的麻烦,请尝试查看此帖子stackoverflow.com/a/11081252/1767021
  • 我决定将我的构建问题视为 X/Y 问题,并且刚刚淘汰了 Maven。现在大家都开心多了。
【解决方案2】:

Maven 默认增量构建,但事实证明编译器插件(即 javac 的核心)是如此之快,以至于每次构建新的代码库都不是瓶颈,而不是与构建大型程序集或运行大型测试套件。 (与大多数语言一样,Java 的编译速度比 C++ 快得多。)

【讨论】:

  • 作为比较,在我的代码中,编译 Java 代码所花费的时间大约是构建总时间的 1%,也许更少。它足够短,我根本不在乎尝试进一步优化它。
  • 问题完全在于依赖于编译阶段的所有其他构建步骤(主要是单元测试、打包、其他插件,如程序集等)。如果无论是否有任何要编译的更改都被触发,那么当人们要求增量构建时,您就会一直浪费时间。
  • Maven 不会增量构建。 Maven 的创建者正在使用新的生命周期来解决这个问题。我完全不知道为什么版主@Ryan 删除了一个引用这个的答案:stackoverflow.com/posts/28224819/revisions
  • the compiler plugin is so fast that building fresh every time is not a bottleneck with sane codebase sizes - 认真的吗?该推理与以下相同:您为什么要修复一个使您的应用程序不断崩溃的错误,该错误会自动以超快的速度重新启动,而修复该错误需要数小时。
  • 喜欢这个答案,正是我永远不会愿意使用 maven 的原因。糟糕的文档。没有直接的答案。太多“哇”的恶作剧了。
【解决方案3】:

如果您的项目有数百个模块,您可以使用maven-incremental build plugin。它节省了很多时间。

【讨论】:

【解决方案4】:

Takari Maven 生命周期

是的,感谢takari-lifecycle-plugin,现在可以实现了。看看这个示例项目:maven-incremental-compilation

样本输出

[INFO] --- takari-lifecycle-plugin:1.10.2:compile (default-compile) @ maven-incremental-compilation ---
[INFO] Performing incremental build
[INFO] Compiling 2 sources to /home/mariuszs/maven-incremental-compilation/target/classes
[INFO] Compiled 1 out of 2 sources (670 ms)

更多信息

【讨论】:

    【解决方案5】:

    Maven 支持使用命令行参数-pl-am-amd 来构建多模块项目的子集,分别指定要构建的模块、构建依赖项和构建依赖项。它也只会编译任何给定模块中更改的源文件(不是真正的 Maven 功能,而是 javac 功能)。

    【讨论】:

      【解决方案6】:

      更新:真正的增量构建支持 - 类似于 Gradle 中的支持 - 已在 Maven 代码库中实现。介绍视频在这里:https://youtu.be/DEQG4CNFMFE

      虽然到目前为止 maven 核心不支持缓存,但你可以查看这个 PR——它是一个真正的增量构建,支持远程缓存。它还支持几乎所有插件 - https://github.com/apache/maven/pull/526

      您可以从分支构建和尝试 maven 并享受。我们正在努力将缓存以核心扩展的形式引入 Maven

      亲切的问候 亚历克斯

      【讨论】:

      • 只是一个提示 - 700 多个模块项目的构建时间从 50 分钟减少到 4 分钟
      猜你喜欢
      • 2011-09-11
      • 1970-01-01
      • 2012-07-27
      • 2014-08-10
      • 1970-01-01
      • 2017-01-24
      • 2016-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多