Maven是比较流行的java构建工具,Maven的常见问题可能包括依赖冲突、缓存解析,以及构建时间缓慢。为什么Maven构建花费的时间比它应该花费的时间更长,如何改进。下面是对Maven缓慢构建进行故障排除的四个技巧。
1. Maven中的并行构建
默认情况下,Maven不会利用硬件的全部功能。它按顺序而不是并行地构建所有模块。但是,项目设置通常不要求是连续的。通常,您可以命令Maven分析项目,包括依赖关系图,并在可能的情况下并行构建项目。您可以指定用于构建项目的确切线程数,也可以使用参数的可移植版本,并根据计算机上可用的CPU指定线程数。
mvn -T 4 install -- will use 4 threads
mvn -T 1C install -- will use 1 thread per available CPU core
虽然您的项目可能不容易并行构建,但值得一试,速度可能会大大加快。默认情况下,每个CPU核心使用一个线程。您的开发机器可能有多余的计算能力,加快构建总是有用的。
2. 并行运行Maven测试
测试是构建的一个方面,它可能对您的构建速度有最大的影响。最常见的做法是在您只对构建工件感兴趣时禁用测试,但我们不能推荐这种非常规工程实践。如果您真的打算在Maven构建过程中跳过测试目标,那么大多数插件所尊重的最常见属性是:-DskipTests=true。然而,您可以在不破坏反馈循环的情况下实现更快的构建时间。
答案是并行运行测试。我们刚才讨论的并行化技术在模块级工作。如果您正在使用一个已建立的插件来运行测试,比如说Surefire,您还可以将其配置为在模块内并行执行。并行运行测试可能会导致不必要的副作用,特别是当它们纠结在一起并期望按特定顺序执行时。然而,这完全是另一回事,你应该完全尝试一下,看看它是否适合你,以及它能加速你的构建速度。你可以在以后找出失败的原因。
3. 仅构建必要的模块
您通常使用什么命令来构建项目?答案是:
mvn clean install
清理Maven时,会删除所有生成的工件、所有临时文件,除了配置和签入版本控制的文件。然后,它会再次生成这些文件的新副本。当您遇到一个奇怪的缓存问题或一些您有但其他人无法复制的模糊错误时,它非常有用。
然而,这将需要额外宝贵的秒数和CPU周期来完成基本上不必要的重新创建现有文件的工作。相反,您通常想要做的是以增量方式构建项目。
假设您有一个多模块项目,其中包含很少更改的公共核心模块,以及您当前正在开发的web界面。更改web界面模块后,请尝试运行以下命令:
mvn install -pl $moduleName -am
首先,我们删除了对clean阶段的隐式调用。这个项目很少需要清洁,所以我们不想一直这样做。让我们看一下刚才使用的Maven命令中其他选项的描述:
-pl-使Maven只构建指定的模块,而不是整个项目。
-am-使Maven了解我们的目标依赖于哪些模块,并构建它们。
同时使用这些选项的结果是灵活性和速度的完美结合。我们知道我们通常使用什么模块,如果我们更改了任何依赖项,它们也将被更新。同时,您的项目构建的很大一部分将被跳过,因为它仍然是新的,不需要重建,或者因为它不是目标模块的一部分,也不会发挥作用。
4. 限制上网
如果你有时觉得Maven正在下载互联网,要知道你并不孤单!这是任何构建系统、npm、gradle、sbt最常见的投诉之一。如果你能说出它的名字,你会惊讶于有多少人类已知的库和可传递的依赖项需要在任意的、通常是最不合适的时间下载。然而,有一个简单的选项可以让Maven离线工作。
启用脱机模式时,Maven在解析依赖项时不会连接到任何远程存储库。本地存储库中的所有jar文件仍然可用,因此不会破坏您的正常工作流程。因此,只需在mvn命令后面附加--offline或--o,Maven就不会试图检查您最喜欢的依赖项的新快照,也不会让您等待网络响应。
发表评论 取消回复