是否有工具可以对Maven构建过程本身进行分析,这样我就可以看到构建在哪里花费了大部分时间?
我们在工作中遇到了Maven 3.0.3和3.0b1的问题。与3.0.3 (9m00s)相比,我们的项目在3.0b1 (3m30s)下构建速度要快得多。使用3.0b1,构建速度大约快63% (如果我的数学是正确的)。
我尝试搜索有关Maven 3的性能比较和性能问题,但是找不到任何东西。
更新
我通过查看maven源做了更多的研究,这就是我发现的:
在使用j控制台时,我看到大部分时间(在3.0.3中)都是在DefaultProjectDependenciesResolver.java中度过的。因此,我将源代码下载到3.0b1和3.0.3,以查看发生了什么。我注意到在3.0.3中有两个版本的类。一个在org.apache.maven.project,另一个在org.apache.maven。另外,在3.0.3中,使用的似乎是前者。在遍历代码时,我看到大部分时间都是在到达以下语句时花费的:
node = repoSystem.collectDependencies( session, collect ).getRoot();在3.0b1中,代码可以:
ArtifactResolutionResult result = repositorySystem.resolve( request );我还注意到respositorySystem是RepositorySystem类型的,具体的实现是LegacyRepositorySystem。我假设这是在Maven 3处于测试版时使用的,直到创建了新的实现?回到3.0.3,collectDependencies方法驻留在DefaultRepositorySystem.java中,这是org.sonatype.aether.impl.internal的一部分。这最终会调用collectDependencies is DefaultDependencyCollector.java,这也是org.sonatype.aether.impl.internal的一部分。我假设这就是构建依赖关系图的方式。
我现在想知道这是因为我们的依赖关系是如何构造的。以前有人见过这种行为吗?
更新
JIRA中有一个关于这个问题的问题以及一个建议的修复。我已经把这些细节作为答复发出去了。
更新
这个问题是由于maven 3.0.3 (1.11)中使用的乙醚版本造成的。版本1.12的乙醚修复了这个问题。我签出了maven 3.0.3的源代码,并编辑了POM,将乙醚的版本从1.11更改为1.12。然后,我从源代码构建了maven,并用我构建的版本替换了我的当前版本。建造时间的减少是戏剧性的。
如果您不想从源代码构建maven,可以用1.12版本替换maven的lib目录中的乙醚库。这也应该有效。
我不确定这个更改是否会使其变为3.0.4,因为maven开发人员说,许可的更改从ether1.11到aee1.12,所以他们仍在讨论。
发布于 2011-07-14 20:53:30
Maven只是一个普通的Java应用程序,所以我建议您使用分析工具(如YourKit或JProfiler )启动它,并分析它的运行时性能。还可以使用JVisualVM提取运行时性能信息。
总之,我相信Maven开发人员会有兴趣了解这种性能回归。请在马文·吉拉中打开一张票,或在Maven开发人员列表上张贴
发布于 2013-10-07 12:01:05
至于分析Maven构建的一般问题,这个Codehaus JIRA问题提供了一个用于输出Mojos执行时间的修补程序。不幸的是,它还没有包含在Maven中。
发布于 2022-03-21 10:16:21
现代答案:一些剖析器列在Maven扩展上。一个仍然活跃的是jcgay/maven-分析器,我可以成功地使用它。
https://stackoverflow.com/questions/6681968
复制相似问题