如何让Maven构建更快?

cbjzeqam  于 2022-11-22  发布在  Maven
关注(0)|答案(9)|浏览(171)

我有一个多模块的java项目。Maven花了大约40秒来构建它。我也尝试过用多线程构建Maven,通过指定-T和-C参数来指定要使用的线程和内核数量。但是我还没有看到我构建的墙时间有任何显著的改善。
我正在使用Maven 3.2.3,有时我需要非常频繁地构建我的项目。
我知道干净进球需要很多时间,但我不能忽略它。
请提出建议......
编辑:
注意:在我的情况下,清理不需要太多时间。它在1秒钟内完成。安装占用了其余的时间。

xoefb8l8

xoefb8l81#

注:第一件事是AFAIK,除了这里的所有答案,Maven中没有其他内置选项可用。

使用多线程运行maven build可以加快构建速度。例如:

mvn clean install -T100

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

Below are the variants from wiki(第一个字母)

Maven 3.x具有执行并行构建的功能。命令如下所示:

  • mvn -T 4全新安装构建4个线程
  • mvn -T 1C全新安装每个cpu内核1个线程
  • mvn -T 1.5C全新安装,每个cpu内核1.5个线程

如何评估执行(See Parallel builds in Maven 3)?

图中的每个节点代表一个多模块构建中的一个模块,“级别”只是表示到内部reactor依赖关系图中第一个模块的距离。Maven根据多模块构建中声明的模块间依赖关系计算此图。请注意,父Maven项目也是一个依赖关系。这解释了为什么大多数项目图的顶部只有一个节点。2React器外部的依赖关系不影响这个图。

最后,如果您想跳过测试执行,也可以使用-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] *****************************************************************
eqoofvh9

eqoofvh92#

在我的实际项目中:

  1. mvn clean install [信息]总时间:凌晨1点05分
  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分
    1.我们还可以跳过要生成的javadoc,如Archmed注解,方法是添加**-Dmaven.javadoc.skip=true**mvn -T 1C clean install -Dmaven.test.skip -DskipTests -Dmaven.javadoc.skip=true
    1.不要使用imports,在IntelliJ上,选择〉Analyze〉Run inspection by name〉 imports,以查找所有 * 导入并更正它。
    1.删除项目中所有未使用的导入〉在Intellij上〉分析〉按名称运行检查〉未使用的导入
    1.删除Intellij上所有未使用的代码(类、变量、字段、参数等):分析〉按名称运行检查〉未使用的声明。
    1.升级到最新JAVA版本
    1.我发现任务mvn clean在构建前需要2分钟来清理TARGET文件夹。我确实创建了一个名为quickclean的新任务,并且我使用它来代替清理,方法是mvn -T 1C quickclean install -Dmaven.test.skip -DskipTests。这个新任务quickclean只是将构建文件夹从TARGET重命名为TARGET-yyyy-MM-dd-HH-mm(* 什么是非常快 *)。所以现在,每次您创建一个新的mvn quickclean install...时,都会有一个包含构建时间的文件夹。不方便的地方是,这可能会占用大量硬盘空间,所以有时候你必须清理所有这些目录。2为此我创建了另一个任务,叫做: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>
hyrbngr7

hyrbngr73#

您可以使用一些small-2技巧来优化构建,例如
1.如果您已经编写了Junit测试,并且不想每次都运行测试用例,则可以使用-DskipTests=true
1.本地安装Nexus或存储库
1.您可以将内存配置调整到最佳状态,例如:将此行添加到mvn.bat集合MAVEN_OPTS=-Xmx512m -XX:MaxPermSize=256m
有关详细信息,请查看How to Speed Your Maven build

xqnpmsa8

xqnpmsa84#

你可以做一个黑客的方式,如果你有一些额外的RAM像我一样,你不需要SSD,因为它的敏感SSD做了很多读写.即使你禁用+位(MacOS -我不记得如果赢有类似的问题).但是
1.创建RAM驱动器(方法数量取决于操作系统)并将其安装到/Users/Username/volatile文件夹
1.在MVN_HOME/lib中找到maven模块构建器X.X.X.jar
1.在JAR文件中,通过修改
&lt;build>&lt;directory>/Users/Username/volatile/${project.groupId}/${project.artifactId}/${project.version}/target
1.从现在开始,所有的项目编译都将在内存中完成。这是一个差异,即使与SSD相比。
是的,它的黑客和一些maven插件可以停止工作顺便说一句。

5n0oy7gb

5n0oy7gb5#

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

mvn -T 8C clean install -DskipTests
laik7k3q

laik7k3q6#

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

wztqucjr

wztqucjr7#

使用内存磁盘的低级别速度(Windows)

我的另一个技巧是使用内存磁盘
1.创建一个2GB的内存磁盘(例如 D:
1.将IDE、Maven、JDK和.m2/repository安装到该内存磁盘(D:/m2/)。
1.编辑Maven的D:/maven/conf/settings.xml以使用该内存磁盘存储库(<localRepository>D:/m2</localRepository>
1.将项目放入内存盘。
1.运行在Ramdisk中具有临时文件夹的项目。
在我的机器上我把

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 14.954 s (Wall Clock)
[INFO] Finished at: 2021-02-17T13:07:51+01:00
[INFO] Final Memory: 55M/642M
[INFO] ------------------------------------------------------------------------

进入

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  6.805 s (Wall Clock)
[INFO] Finished at: 2021-11-11T10:48:14Z
[INFO] ------------------------------------------------------------------------

两种结果均为高端(-DskipTests -T 12
警告:不要忘记在关机前保存ramdisk,否则您的工作会丢失。
看看这头野兽:

zzzyeukh

zzzyeukh8#

您可以尝试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

falq053o

falq053o9#

如果您使用的是带有maven的spring Boot ,并且您觉得依赖项进入系统的速度很慢,请尝试在pom.xml中进行以下设置

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.0</version>
        <relativePath /> 
</parent>

我发现版本2.7.0下载依赖项的速度比其他版本快。

相关问题