Maven是否支持增量构建?

rip*_*234 39 java maven

如何使用Maven来支持增量构建?某处有指南吗?(谷歌的顶级成绩令人失望)

rob*_*ert 10

我无法弄清楚驱动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>
Run Code Online (Sandbox Code Playgroud)

这是useIncrementalCompilation一组到false这里是关键.

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

[INFO] Changes detected - recompiling the module!
[INFO] Compiling 114 source files to /home/vagrant/workspace/splat/target/classes
Run Code Online (Sandbox Code Playgroud)

至

[INFO] Compiling 1 source file to /home/vagrant/workspace/splat/target/classes
Run Code Online (Sandbox Code Playgroud)

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


小智 6

如果您的项目有数百个模块,则可以使用maven-incremental构建插件.它节省了大量时间.

  • 链接坏了. (3认同)

Ale*_*kin 6

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

Update2:maven构建缓存扩展正式发布 - https://github.com/apache/maven-build-cache-extension

亲切的问候亚历克斯


Don*_*ows 5

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

  • `编译器插件是如此之快,以至于每次构建新鲜都不是知名代码库大小的瓶颈 - 严重吗?这个推理是相同的:为什么你要修复一个不断崩溃你的应用程序的错误,它会自动重启超快,而修复bug需要几个小时. (18认同)
  • 问题恰恰在于所有其他构建步骤(主要是单元测试,打包,其他插件,如装配等),这取决于编译阶段.如果无论编译是否有任何变化都触发了它们,那么当他们要求增量构建时,你总是浪费时间. (11认同)
  • Maven不会逐步构建.Maven的创建者正在以新的生命周期开展这项工作.我完全不知道为什么主持人@Ryan删除了引用这个的答案:http://stackoverflow.com/posts/28224819/revisions (7认同)
  • 为了比较,在我的代码中,编译Java代码所花费的时间约占构建总时间的1%,可能更少.它足够短,我只是不在乎尝试进一步优化它. (6认同)
  • 喜欢这个答案,正是我永远不会自愿使用maven的原因.档案不好.没有直接的答案.太多"Woo"hocus pocus. (4认同)
  • 是的,编译速度很快。但是,不必要的编译仍然会减慢构建速度,因为更改了类/ jar的时间戳使其无法/很难可靠地避免不必要地重新运行测试等。整个构建系统在设计时必须考虑到增量对象图。不幸的是,还没有。 (3认同)
  • 使用gradle之类的工具,不仅要避免运行javac,还要避免依赖于javac输出的任务。也就是说,如果该模块的源未更改,则gradle也可以避免运行测试任务。Maven失败是因为它每次都必须运行所有任务,因为它没有“如果您不从projectA更改jar,请勿构建或测试projectB”的概念。 (2认同)

Mar*_*szS 5

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)
Run Code Online (Sandbox Code Playgroud)

更多信息