如何加速我的maven2构建?

35

我正在使用本地的仓库代理请求,但是构建和测试阶段仍然有点慢。实际的编译和测试并不慢,而是maven2框架的“热身”过程。有什么想法吗?


2
如果您在其他地方找到了一个好的答案,我们非常希望您将其作为答案发布在这里。 - Einar
我发现这篇文章很有帮助。限制互联网访问对我很有效。 - artronics
8个回答

24

有一些可能性可以优化一些构建任务。例如,使用简单的技巧 - 重命名“target”文件夹而不是删除,可以将“clean”任务从几分钟优化到仅毫秒。

要了解如何执行此操作的详细信息,请参考加速Maven构建


很棒的技巧,我经常会在清理任务上浪费不必要的时间。 - s3v1
2
我花了一些时间解决这个问题,并写了一篇博客文章...希望能帮助其他人!http://www.urbancat.org/2012/05/how-to-speed-maven-up.html - Nadav
1
@nadav,链接已失效。你能修复一下吗? - Gábor Lipták

9

我不知道你使用的是哪个版本的Maven,我假设你使用的是2.x版本。而我将给出如下用于加速构建过程的Maven 1.x配置:

这些配置将把junit测试进程分离出来(当你在测试中使用环境变量时,它同样会有所帮助,并且为测试提供更多内存)。

-Dmaven.junit.fork=true
-Dmaven.junit.jvmargs=-Xmx512m

这将分叉编译过程,可能会加快速度。

-Dmaven.compile.fork=true

我希望这能有所帮助,试试看吧。
此外,请参考如何提高maven2构建速度

我正在使用maven2,但这是一个不错的链接,我一定会尝试那个修补过的版本来下载。 然而问题更多地涉及构建和测试启动时间... - s3v1
启用fork使我的项目稍微快了一点。 - Gábor Lipták

9
如果你正在使用Maven3 ($ mvn -version),你也可以按照这个指南进行操作。在我的情况下,结果如下:
正常执行:
$ mvn clean install 
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 03:05 min
[INFO] Finished at: 2015-07-15T11:47:02+02:00
[INFO] Final Memory: 88M/384M

采用并行处理(4个线程):

$ mvn -T 4 clean install
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 02:22 min (Wall Clock)
[INFO] Finished at: 2015-07-15T11:50:57+02:00
[INFO] Final Memory: 80M/533M

并行处理(每个核心2个线程)

$ mvn -T 2C clean install

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 02:12 min (Wall Clock)
[INFO] Finished at: 2015-07-15T12:00:29+02:00
[INFO] Final Memory: 87M/519M
[INFO] ------------------------------------------------------------------------

正如我们所看到的,时间差几乎有1分钟之多,速度提升了20-30%左右。


4
  1. 调整内存配置以达到最佳效果,例如:在mvn.bat中添加以下行 set MAVEN_OPTS=-Xmx512m -XX:MaxPermSize=256m

  2. mvn的清理阶段通常会删除目标文件夹。如果我们将目标文件夹重命名,则清理阶段会快得多。<quickClean>

  3. -Dmaven.test.skip=true将跳过测试执行。

  4. 在mvn命令行参数中添加-Denforcer.skip=true(这是强制使用maven、jdk版本等的版本,我们可以在初始运行后跳过它)

  5. 在构建阶段禁用非关键操作:分析、javadoc生成、源代码打包。这将节省大量时间。

  6. 在生成新进程方面也有助于提高时间效率。 -Dmaven.junit.fork=true(将junit测试分叉到一个新进程中) -Dmaven.compile.fork=true(分叉编译)

    希望这些内容能对您有所帮助。


3
您可以使用-DskipTests=true跳过单元测试,从而加快构建速度。

1
那么,一开始就不进行任何测试呢..? - Rob
CI机器人在构建时会执行所有这些操作,因此它们必须存在。 - Thorbjørn Ravn Andersen
使用“-o”表示离线模式,它不会查看快照的远程更新,这很有帮助。 - Abs

2
我发现解析反应堆项目的速度比单个pom项目慢得多。如果您的构建是反应堆(多模块)且您的开发人员不同时在所有模块上工作,您可以删除父POM并分别构建它们,使用本地存储库解决依赖关系。缺点是您需要安装或部署模块以使其依赖项看到更改。
此外,您可能希望查看包含一些重要速度改进的新Maven 2.1 M1版本。
如果这些都没有帮助,请发布有关项目配置(模块结构和插件)、命令行参数和硬件配置(内存和磁盘)的更多详细信息。使用 -X 运行 Maven 也可以显示它花费时间的位置。

这确实是我正在使用的反应堆项目。有三个小模块和一个网站项目。我尝试了那个2.1版本的构建,它似乎快了一点。 - s3v1

1

我会使用本地安装的Nexus。


Nexus也不错。我使用过Nexus和Artifactory,它们都非常快。在我看来,Nexus配置起来稍微容易一些。 - s3v1
Nexus做了什么可以帮助这个过程? - snowe

0

最初,您应该使用类似this的工具对构建时间进行更精细的分析,并确定花费最多时间的候选项。

测试是否每个测试都在启动H2数据库?下载外部jar文件是否需要时间?这将指导您在哪里集中调查。仅应用go-fast标志通常不起作用,因为它们已经默认包含在内,而且您不想通过跳过标志来牺牲测试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接