如何让maven构建得更快?

Shu*_*sia 33 java multithreading scala build maven

我有一个多模块java项目.Maven需要大约40秒来构建它.我通过指定-T和-Cargs来尝试使用多线程构建的maven,因为没有使用线程和内核.但我没有看到我的构建的时间有任何显着改善.
我正在使用maven 3.2.3,有时我需要经常构建我的项目.
我知道干净的目标需要花费很多时间,但我不能忽略它.
建议请....

编辑:
注意:在我的情况下,清洁不会花费太多时间.它在1秒内完成.安装正在休息.

mou*_*d m 32

在我的实际项目中:

  1. mvn clean install[INFO] 总时间:01:05 h
  2. mvn clean install -DskipTests[信息] 总时间:18 : 35 分钟
  3. mvn clean install -Dmaven.test.skip -DskipTests [信息] 总时间:10:58 分钟
  4. mvn -T 1C clean install -Dmaven.test.skip -DskipTests[信息] 总时间:04 : 00 分钟
  5. 我们还可以通过添加-Dmaven.javadoc.skip=true跳过要生成的 javadoc,作为Archmed 的注释 mvn -T 1C clean install -Dmaven.test.skip -DskipTests -Dmaven.javadoc.skip=true
  6. 不要使用* 导入,在 IntelliJ 上,选择 > 分析 > 按名称运行检查 > * 导入,以查找所有 * 导入并进行更正。
  7. 删除项目中所有未使用的导入> 在 Intellij > 分析 > 按名称运行检查 > 未使用的导入
  8. 删除Intellij 上所有未使用的代码(类、变量、字段、参数等):分析 > 按名称运行检查 > 未使用的声明。
  9. 升级到最新的 JAVA 版本
  10. 我发现任务mvn clean在构建之前需要 2 分钟来清理 TARGET 文件夹。我确实创建了一个名为quickclean的新任务,我正在使用它而不是 clean,这种方式mvn -T 1C quickclean install -Dmaven.test.skip -DskipTests。这个新任务 quickclean 只是将构建文件夹从 TARGET重命名为 TARGET-yyyy-MM-dd-HH-mm(非常快)。所以现在,每次创建 new 时mvn quickclean install...,都会有一个包含构建时间的文件夹。不方便的是,这可能会占用硬盘上的大量空间,因此有时您必须清理所有这些目录。为此,我创建了另一个名为:trashclean 的任务, 将所有此文件夹放入垃圾箱。我可能每周都按时运行这些任务。或月,取决于我的工作mvn trashclean

如果你想使用这个概念,这里是你需要添加到 pom.xml 的内容

<properties>
    <timestamp>${maven.build.timestamp}</timestamp>
    <maven.build.timestamp.format>yyyy-MM-dd-HH-mm</maven.build.timestamp.format>
    <trashdir>trash/target-${maven.build.timestamp}</trashdir>
</properties>

    <profile>
        <id>quickclean</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-antrun-plugin</artifactId>
                    <executions>
                        <execution>
                            <id>rename_target</id>
                            <phase>pre-clean</phase>
                            <goals>
                                <goal>run</goal>
                            </goals>
                            <configuration>
                                <tasks>
                                    <move todir="${trashdir}" failonerror="false">
                                        <fileset dir="target/"/>
                                    </move>
                                </tasks>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>
    <profile>
        <id>trashclean</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-antrun-plugin</artifactId>
                    <executions>
                        <execution>
                            <id>clean_trash</id>
                            <phase>clean</phase>
                            <goals>
                                <goal>run</goal>
                            </goals>
                            <configuration>
                                <tasks>
                                    <delete dir="trash/" failonerror="false"/>
                                </tasks>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </profile>
    
Run Code Online (Sandbox Code Playgroud)

  • 2 仍然编译测试但不运行它们,3 甚至不编译测试。`-DskipTests` 在 3 中是多余的,可以省略,它将产生相同的结果。 (11认同)

Ram*_*ram 31

注意:首先是AFAIK,除了这里的所有答案之外,maven中没有其他内置选项.


使用多线程运行maven构建对我来说可以加速构建.例如 :

mvn clean install -T100
Run Code Online (Sandbox Code Playgroud)

其中-T用于根据硬件指定所需的线程数.

以下是维基的变种

Maven 3.x具有执行并行构建的能力.命令如下:

  • mvn -T 4 clean install用4个线程构建
  • mvn -T 1C清理安装每个cpu核心1个线程
  • mvn -T 1.5C clean每个cpu核心安装1.5个线程

如何评估执行(参见Maven 3中的并行构建)?

在此输入图像描述

图中的每个节点表示多模块构建中的模块,"级别"仅指示到内部反应器依赖性图中的第一个模块的距离.Maven根据多模块构建的声明的模块间依赖关系计算此图.请注意,父maven项目也是一个依赖项,这解释了为什么在大多数项目图上都有一个节点.反应堆外的依赖性不会影响该图.

最后,如果您想跳过测试执行,您也可以使用-DskipTests它.

警告: 某些插件可能与多线程构建器不兼容,它可能有效.但它会给出以下警告信息.您可能需要查看多线程支持的插件文档.

[WARNING] *****************************************************************                                                                                                                                 
[WARNING] * Your build is requesting parallel execution, but project      *                                                                                                                                 
[WARNING] * contains the following plugin(s) that have goals not marked   *                                                                                                                                 
[WARNING] * as @threadSafe to support parallel building.                  *                                                                                                                                 
[WARNING] * While this /may/ work fine, please look for plugin updates    *                                                                                                                                 
[WARNING] * and/or request plugins be made thread-safe.                   *                                                                                                                                 
[WARNING] * If reporting an issue, report it against the plugin in        *                                                                                                                                 
[WARNING] * question, not against maven-core                              *                                                                                                                                 
[WARNING] *****************************************************************                                                                                                                                 
[WARNING] The following plugins are not marked @threadSafe in test-project:                                                                                                                          
[WARNING] de.dentrassi.maven:rpm:0.9.2                                                                                                                                                                      
[WARNING] Enable debug to see more precisely which goals are not marked @threadSafe.                                                                                                                        
[WARNING] *****************************************************************    
Run Code Online (Sandbox Code Playgroud)

  • -DskipTests 仍然编译测试。如果您也想跳过编译,请使用 -Dmaven.test.skip (8认同)

ccr*_*on1 7

如果使用命令行,您可以检查您的机器有多少个内核并使用所有这些内核,如果您还想跳过测试,您可以添加-DskipTests 例如,我有 8 核处理器:

mvn -T 8C clean install -DskipTests
Run Code Online (Sandbox Code Playgroud)

  • -T xC 实际上是每个内核的线程数,因此在您的情况下它是 8 * 8 = 64 个线程。如果要指定 maven 进程产生的确切线程数,则应使用 -T x 选项。来源:https://cwiki.apache.org/confluence/display/MAVEN/Parallel+builds+in+Maven+3 (26认同)

Sub*_*shi 6

您可以使用一些小技巧来优化构建,例如

  1. 如果你已经写过 Junit Test 并且不想每次都运行测试用例,可以使用 -DskipTests=true
  2. 在本地安装 Nexus 或存储库
  3. 您可以将内存配置调整为最佳,例如:添加此行以mvn.bat设置MAVEN_OPTS=-Xmx512m -XX:MaxPermSize=256m

有关更多信息,您可以查看如何加速您的 Maven 构建

  • 此外,SSD 大大加快了构建速度。 (6认同)

小智 5

如果您像我一样有一些额外的 RAM,并且您不需要 SSD,那么您可以采用一种hacky 方式,因为 SSD 进行大量读写操作很敏感。即使您禁用 + 一点(MacOS - 我不记得 Win 是否有类似的问题)。但

  1. 创建 RAM 驱动器(方式数量取决于您的操作系统)并将其安装到 /Users/Username/volatile 文件夹

  2. 在 MVN_HOME/lib 中找到 maven-module-builder-XXXjar

  3. 在 JAR 中修改文件 org/apache/maven/model/pom-4.0.0.xml 通过修改

&lt;build>&lt;directory>/Users/Username/volatile/${project.groupId}/${project.artifactId}/${project.version}/target

  1. 从现在开始,所有项目编译都将在内存中完成。即使与SSD相比,它也是不同的。

是的,它的 hack 和一些 Maven 插件可以停止工作 BTW。


小智 5

除了许多人已经提到的并行运行之外,尝试这些可以加快构建速度的 Maven 选项 -XX:+TieredCompilation -XX:TieredStopAtLevel=1


小智 5

您可以尝试turbo-maven-plugin来帮助加速您的多模块Maven本地构建(我是插件作者之一)?

https://github.com/sparebank1utvikling/turbo-maven-plugin

它的工作原理是分析哪些模块实际上有代码更改,并仅构建那些模块以及依赖于它们的模块。有关其工作原理的更多信息请参见此处:

https://medium.com/sparebank1-digital/speed-up-your-multi-module-maven-builds-with-turbo-maven-plugin-4be0eb2a2601