【问题标题】:How to time the different stages of maven execution如何对 Maven 执行的不同阶段进行计时
【发布时间】:2011-07-04 11:26:45
【问题描述】:

我有一个非常慢的 Maven 构建。我想知道是否有一种方法可以分析 maven 执行,以便找出最耗时的步骤。

稍后我会想比较旧版本(更快)的构建之间的这些时间,因此理想情况下它们应该采用可以比较/差异/绘图的格式。

【问题讨论】:

  • 我通常在 maven 日志设置中开启相对时间戳。这不会从消息中占用太多空间,并且有助于查看缓慢的步骤。 org.slf4j.simpleLogger.showDateTime=true

标签: maven profiling


【解决方案1】:

这是最快的方法:

export MAVEN_OPTS="-Dorg.slf4j.simpleLogger.dateTimeFormat=HH:mm:ss,SSS \
                   -Dorg.slf4j.simpleLogger.showDateTime=true" 
mvn test

结果

MAVEN_OPTS="-Dorg.slf4j.simpleLogger.dateTimeFormat=HH:mm:ss,SSS -Dorg.slf4j.simpleLogger.showDateTime=true" mvn test
17:06:07,330 [INFO] Scanning for projects...
17:06:07,447 [INFO] 
17:06:07,447 [INFO] ------------------------------------------------------------------------
17:06:07,448 [INFO] Building bimble-server 0.0.1-SNAPSHOT
17:06:07,448 [INFO] ------------------------------------------------------------------------
17:06:07,747 [INFO] 
17:06:07,748 [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ bimble-server ---

如果您随后将该环境变量添加到您的 shell 的配置文件(如 ~/.bashrc~/.profile),您将在每次使用 Maven 时获得这些时间。

基于来自Stanley Hillner's blog:的信息

【讨论】:

  • 谢谢,博客帮了大忙。
  • 非常简单!这就是我所需要的多项目构建时间
【解决方案2】:

开箱即用的解决方案是 takari maven 分析器: https://github.com/takari/maven-profiler

其页面的示例输出:

org.apache.maven:maven-core:3.1.2-SNAPSHOT

    clean 176ms
        org.apache.maven.plugins:maven-clean-plugin:2.5 (default-clean) 176ms

    initialize 408ms
        org.codehaus.mojo:buildnumber-maven-plugin:1.2 (create-noncanonicalrev) 349ms
        org.codehaus.mojo:buildnumber-maven-plugin:1.2 (create-buildnumber) 59ms

    generate-sources 408ms
        org.codehaus.modello:modello-maven-plugin:1.8.1 (standard) 369ms
        org.codehaus.modello:modello-maven-plugin:1.8.1 (standard) 28ms
        org.codehaus.modello:modello-maven-plugin:1.8.1 (standard) 11ms

    generate-resources 933ms
        org.apache.maven.plugins:maven-remote-resources-plugin:1.4 (default) 932ms

    process-resources 225ms
        org.apache.maven.plugins:maven-resources-plugin:2.6 (default-resources) 224ms

    compile 4s 522ms
        org.apache.maven.plugins:maven-compiler-plugin:2.5.1 (default-compile) 4s 522ms

    process-classes 6s 880ms
        org.codehaus.mojo:animal-sniffer-maven-plugin:1.6 (check-java-1.5-compat) 5s 814ms
        org.codehaus.plexus:plexus-component-metadata:1.5.5 (default) 946ms
        org.sonatype.plugins:sisu-maven-plugin:1.1 (default) 120ms

    process-test-resources 173ms
        org.apache.maven.plugins:maven-resources-plugin:2.6 (default-testResources) 173ms

    test-compile 818ms
        org.apache.maven.plugins:maven-compiler-plugin:2.5.1 (default-testCompile) 818ms

    process-test-classes 134ms
        org.codehaus.plexus:plexus-component-metadata:1.5.5 (default) 110ms
        org.sonatype.plugins:sisu-maven-plugin:1.1 (default) 23ms

    test 11s 306ms
        org.apache.maven.plugins:maven-surefire-plugin:2.12 (default-test) 11s 306ms

    package 1s 371ms
        org.apache.maven.plugins:maven-jar-plugin:2.4 (default-jar) 502ms
        org.apache.maven.plugins:maven-site-plugin:3.3 (attach-descriptor) 869ms

【讨论】:

  • @ShintaSmith:有什么问题?
  • 它根本不产生任何分析输出
  • 你把它的jar放到${M2_HOME}/lib/ext中了吗?
  • @qtips 很高兴听到
  • 我有很多“[WARNING] Failed to notify spy io.tesla.lifecycle.profiler.LifecycleProfiler: null”将它与 Maven 3.3.9 一起使用并使用 -T 构建多组件。最终报告没用
【解决方案3】:

https://github.com/jcgay/maven-profiler 是一个类似的方便工具。它易于设置和使用。 (在核心 Maven 中有类似的东西或 EventSpy takari/maven-profiler 作为一个选项肯定会很整洁;评论https://issues.apache.org/jira/browse/MNG-4639 ..)

【讨论】:

  • 此分析器在多模块构建时存在问题,也不支持 -T -- 请参阅 github 上的问题
【解决方案4】:

此功能已包含在 Maven3 中。这是相关的票证:https://issues.apache.org/jira/browse/MNG-4639

如果您需要对 Maven2 执行相同操作,我建议您构建您自己的插件,该插件可以挂钩到执行的所有阶段(或者只是您需要跟踪的那些阶段)。

【讨论】:

  • 是的,maven2。任何指向此类插件起点的指针?
  • 从您的链接中,我看到 Hudson 通过检查“执行的 mojos”为我提供了该信息,甚至对于 Maven 2 也确实如此
  • 哦,很好。我认为 Hudson/Jenkins 需要 maven3 支持才能做到这一点。
  • @George,我被那张票弄糊涂了。它仍然是开放的和未分配的。当您说它“包含在 Maven3 中”时,最终用户到底需要做什么?
  • @artbristol,你是对的。该功能显然不包含在 Maven 中。您必须编写自己的 AbstractExecutionListener 或 EventSpy。 Jason van Zyl 提到的 EventSpy 看起来不完整。不支持以 -T 开头的构建。
【解决方案5】:

我只是在这里创建一个要点:https://gist.github.com/boly38/7316378

这是一个关于如何记录某些maven lifecycle steps 的日期时间的示例。

当然,您可以调整此示例以设置您自己的输出格式(并绘制它...)。

希望有帮助


提取:

        <profile>
            <id>stats</id>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-antrun-plugin</artifactId>
                        <executions>
                            <execution>
                                <id>log_validate</id>
                                <phase>validate</phase>
                                <goals><goal>run</goal></goals>
                                <configuration>
                                    <tasks>
                                        <tstamp><format property="stepTstamp" pattern="dd-HH:mm:ss" locale="en,US" /></tstamp>
                                        <echo file="stats.log" append="true"
                                              message="${line.separator}${line.separator}${stepTstamp} validate${line.separator}"/>
                                    </tasks>
                                </configuration>
                            </execution>
    (...)
                            <execution>
                                <id>log_process_sources</id>
                                <phase>process-sources</phase>
                                <goals><goal>run</goal></goals>
                                <configuration>
                                    <tasks>
                                        <tstamp><format property="stepTstamp" pattern="dd-HH:mm:ss" locale="en,US" /></tstamp>
                                        <echo file="stats.log" append="true"
                                              message="${stepTstamp} process-sources${line.separator}"/>
                                    </tasks>
                                </configuration>
                            </execution>
(...)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 2012-01-26
    • 2019-07-17
    • 2018-11-13
    • 1970-01-01
    相关资源
    最近更新 更多