让maven构建更快的方法?
Ways to make maven build faster?
我有一个多模块 java 项目。 Maven 大约需要 40 秒来构建它。我也尝试过使用多线程构建的 Maven,方法是指定 -T 和 -C args 来表示没有要使用的线程和内核。但是我没有看到我的构建的挂墙时间有任何显着改善。
我正在使用 maven 3.2.3,有时我需要非常频繁地构建我的项目。
我知道干净的目标需要很多时间,但我不能忽略它。
请提出建议....
编辑:
注意:在我的例子中,clean 不会花费太多时间。它在 1 秒内完成。安装正在占用剩余时间。
您可以使用一些小技巧来优化构建,例如
- 如果你写过Junit Test,不想每次都运行测试用例,你可以使用
-DskipTests=true
- 本地安装 Nexus 或存储库
- 您可以将内存配置调整到最佳状态,例如:将此行添加到
mvn.bat
set MAVEN_OPTS=-Xmx512m -XX:MaxPermSize=256m
更多信息您可以查看How to Speed Your Maven build
如果使用命令行,您可以检查您的机器有多少个内核并使用所有内核,如果您还想跳过测试,可以添加 -DskipTests
比如我有8核处理器:
mvn -T 8C clean install -DskipTests
注意:首先是 AFAIK,除了此处的所有答案外,maven 中没有其他可用的内置选项。
运行 maven build with Multiple threads 对我来说可以加快构建速度。
例如:
mvn clean install -T100
where -T is for specifying how many threads you want based on your
hardware.
Below are the variants from wiki
Maven 3.x has the capability to perform parallel builds. The command
is as follows:
- mvn -T 4 clean install Builds with 4 threads
- mvn -T 1C clean install 1 thread per cpu core
- mvn -T 1.5C clean install 1.5 thread per cpu core
如何评估执行(See Parallel builds in Maven 3)?
图中的每个节点代表多模块构建中的一个模块,"levels" 仅表示到内部反应器依赖关系图中第一个模块的距离。 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] *****************************************************************
如果你像我一样有一些额外的 RAM,你可以做一个 hacky 的方式,你不需要 SSD,因为 SSD 很敏感,可以做很多读写。即使您稍微禁用 +(MacOS - 我不记得 Win 是否有类似的问题)。但是
创建 RAM 驱动器(方式数量取决于您的 OS)并将其装载到 /Users/Username/volatile 文件夹
在 MVN_HOME/lib
中找到 maven-module-builder-X.X.X.jar
在JAR中通过修改
修改文件org/apache/maven/model/pom-4.0.0.xml
<build><directory>/Users/Username/volatile/${project.groupId}/${project.artifactId}/${project.version}/target
- 从现在开始,所有项目编译都将在内存中完成。甚至与SSD相比也是有区别的。
是的,顺便说一句,它的 hack 和一些 maven 插件可能会停止工作。
关于我的实际项目:
mvn clean install
[INFO] 总时间:01:05 h
mvn clean install -DskipTests
[信息] 总时间:18:35 分钟
mvn clean install -Dmaven.test.skip -DskipTests
[INFO] 总时间:10:58 分钟
mvn -T 1C clean install -Dmaven.test.skip -DskipTests
[信息] 总时间:04:00 分钟
- 我们也可以通过添加 -Dmaven.javadoc.skip=true
mvn -T 1C clean install -Dmaven.test.skip -DskipTests -Dmaven.javadoc.skip=true
- 不要使用 * imports,在 IntelliJ 上,选择 > Analyze > 运行 inspection by name > * imports ,找到所有 * imports 并更正它。
- 删除项目中所有未使用的导入 > 在 Intellij 上 > 分析 > 运行 按名称检查 > 未使用的导入
- 删除所有未使用的代码(类、变量、字段、参数等),在 Intellij 上:分析 > 运行 按名称检查> 未使用的声明。
- 升级到最后一个JAVA版本
- 我发现 mvn clean 任务在构建之前需要 2 分钟来清理 TARGET 文件夹。我确实创建了一个名为 quickclean 的新任务,我正在使用它而不是 clean,这样
mvn -T 1C quickclean install -Dmaven.test.skip -DskipTests
。这个新任务 quickclean 只是 将构建文件夹 从 TARGET 重命名为 TARGET-yyyy-MM-dd-HH-mm(非常快) .所以现在,每次你创建一个新的 mvn quickclean install...
,你都会有一个包含构建时间的文件夹。 不方便,就是这可能会占用大量的space硬盘,所以有时你不得不清理所有这些目录.为此,我创建了另一个名为: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>
除了许多人已经提到的并行 运行 之外,尝试这些可以加快构建速度的 maven 选项
-XX:+TieredCompilation -XX:TieredStopAtLevel=1
使用 Ramdisk 的低级速度 (Windows)
我的额外技巧是使用 ramdisk
- 创建一个2GB的Ramdisk(例如D:)
- 将 IDE、Maven、JDK 和
.m2/repository
安装到该 Ramdisk (D:/m2/
)。
- 编辑 Maven 的
D:/maven/conf/settings.xml
以使用该 Ramdisked 存储库 (<localRepository>D:/m2</localRepository>
)
- 将项目放入虚拟磁盘。
- 运行 项目在 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,否则您的工作会丢失。
看看这个野兽:
我有一个多模块 java 项目。 Maven 大约需要 40 秒来构建它。我也尝试过使用多线程构建的 Maven,方法是指定 -T 和 -C args 来表示没有要使用的线程和内核。但是我没有看到我的构建的挂墙时间有任何显着改善。
我正在使用 maven 3.2.3,有时我需要非常频繁地构建我的项目。
我知道干净的目标需要很多时间,但我不能忽略它。
请提出建议....
编辑:
注意:在我的例子中,clean 不会花费太多时间。它在 1 秒内完成。安装正在占用剩余时间。
您可以使用一些小技巧来优化构建,例如
- 如果你写过Junit Test,不想每次都运行测试用例,你可以使用
-DskipTests=true
- 本地安装 Nexus 或存储库
- 您可以将内存配置调整到最佳状态,例如:将此行添加到
mvn.bat
setMAVEN_OPTS=-Xmx512m -XX:MaxPermSize=256m
更多信息您可以查看How to Speed Your Maven build
如果使用命令行,您可以检查您的机器有多少个内核并使用所有内核,如果您还想跳过测试,可以添加 -DskipTests
比如我有8核处理器:
mvn -T 8C clean install -DskipTests
注意:首先是 AFAIK,除了此处的所有答案外,maven 中没有其他可用的内置选项。
运行 maven build with Multiple threads 对我来说可以加快构建速度。 例如:
mvn clean install -T100
where -T is for specifying how many threads you want based on your hardware.
Below are the variants from wiki
Maven 3.x has the capability to perform parallel builds. The command is as follows:
- mvn -T 4 clean install Builds with 4 threads
- mvn -T 1C clean install 1 thread per cpu core
- mvn -T 1.5C clean install 1.5 thread per cpu core
如何评估执行(See Parallel builds in Maven 3)?
图中的每个节点代表多模块构建中的一个模块,"levels" 仅表示到内部反应器依赖关系图中第一个模块的距离。 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] *****************************************************************
如果你像我一样有一些额外的 RAM,你可以做一个 hacky 的方式,你不需要 SSD,因为 SSD 很敏感,可以做很多读写。即使您稍微禁用 +(MacOS - 我不记得 Win 是否有类似的问题)。但是
创建 RAM 驱动器(方式数量取决于您的 OS)并将其装载到 /Users/Username/volatile 文件夹
在 MVN_HOME/lib
中找到 maven-module-builder-X.X.X.jar在JAR中通过修改
修改文件org/apache/maven/model/pom-4.0.0.xml
<build><directory>/Users/Username/volatile/${project.groupId}/${project.artifactId}/${project.version}/target
- 从现在开始,所有项目编译都将在内存中完成。甚至与SSD相比也是有区别的。
是的,顺便说一句,它的 hack 和一些 maven 插件可能会停止工作。
关于我的实际项目:
mvn clean install
[INFO] 总时间:01:05 hmvn clean install -DskipTests
[信息] 总时间:18:35 分钟mvn clean install -Dmaven.test.skip -DskipTests
[INFO] 总时间:10:58 分钟mvn -T 1C clean install -Dmaven.test.skip -DskipTests
[信息] 总时间:04:00 分钟- 我们也可以通过添加 -Dmaven.javadoc.skip=true
mvn -T 1C clean install -Dmaven.test.skip -DskipTests -Dmaven.javadoc.skip=true
- 不要使用 * imports,在 IntelliJ 上,选择 > Analyze > 运行 inspection by name > * imports ,找到所有 * imports 并更正它。
- 删除项目中所有未使用的导入 > 在 Intellij 上 > 分析 > 运行 按名称检查 > 未使用的导入
- 删除所有未使用的代码(类、变量、字段、参数等),在 Intellij 上:分析 > 运行 按名称检查> 未使用的声明。
- 升级到最后一个JAVA版本
- 我发现 mvn clean 任务在构建之前需要 2 分钟来清理 TARGET 文件夹。我确实创建了一个名为 quickclean 的新任务,我正在使用它而不是 clean,这样
mvn -T 1C quickclean install -Dmaven.test.skip -DskipTests
。这个新任务 quickclean 只是 将构建文件夹 从 TARGET 重命名为 TARGET-yyyy-MM-dd-HH-mm(非常快) .所以现在,每次你创建一个新的mvn quickclean install...
,你都会有一个包含构建时间的文件夹。 不方便,就是这可能会占用大量的space硬盘,所以有时你不得不清理所有这些目录.为此,我创建了另一个名为: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>
除了许多人已经提到的并行 运行 之外,尝试这些可以加快构建速度的 maven 选项 -XX:+TieredCompilation -XX:TieredStopAtLevel=1
使用 Ramdisk 的低级速度 (Windows)
我的额外技巧是使用 ramdisk
- 创建一个2GB的Ramdisk(例如D:)
- 将 IDE、Maven、JDK 和
.m2/repository
安装到该 Ramdisk (D:/m2/
)。 - 编辑 Maven 的
D:/maven/conf/settings.xml
以使用该 Ramdisked 存储库 (<localRepository>D:/m2</localRepository>
) - 将项目放入虚拟磁盘。
- 运行 项目在 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,否则您的工作会丢失。
看看这个野兽: