【问题标题】:How to debug Maven plugin?如何调试 Maven 插件?
【发布时间】:2017-09-07 14:36:58
【问题描述】:

我使用在我的 POM 中配置的 allure-maven 插件。但是,当它失败时

ru.yandex.qatools.allure.data.ReportGenerationException: Could not find any allure results

我想在运行时调试插件,看看它是否正确设置了所有变量。

我已尝试根据Debugging in Maven? 的答案使用mvnDebug。当 Maven 使用 surefire 插件执行测试时,我可以将调试器连接到 JVM。但是,当 Maven 尝试使用 allure 插件生成 Allure 报告时,我无法连接到调试器。 Allure 插件在 POM 的“报告”部分中定义,并由“站点”Maven 目标使用。

这是我用mvn clean test site 命令调用的 POM(几乎完整,我省略了依赖部分)。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns="http://maven.apache.org/POM/4.0.0"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    ...  

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.20</version>
                <configuration>
                    <testFailureIgnore>true</testFailureIgnore>
                    <argLine>-Xmx2048m -XX:-UseSplitVerifier -XX:MaxPermSize=256m
                        -javaagent:${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar
                    </argLine>
                    <properties>
                        <property>
                            <name>parallel</name>
                            <value>classes</value>
                        </property>
                        <property>
                            <name>threadcount</name>
                            <value>4</value>
                        </property>
                    </properties>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>org.aspectj</groupId>
                        <artifactId>aspectjweaver</artifactId>
                        <version>${aspectj.version}</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>


    <reporting>
        <excludeDefaults>true</excludeDefaults>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-report-plugin</artifactId>
                <version>2.19.1</version>
            </plugin>
            <plugin>
                <groupId>io.qameta.allure</groupId>
                <artifactId>allure-maven</artifactId>
                <version>2.8</version>
                <configuration>
                </configuration>
            </plugin>
        </plugins>
    </reporting>

    <pluginRepositories>
        <pluginRepository>
            <id>mvn-nexus-all</id>
            <url>https://lunabuild.akamai.com/nexus/content/groups/public/</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </pluginRepository>
    </pluginRepositories>
</project>

这是来自失败插件的完整堆栈跟踪:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-site-plugin:3.3:site (default-site) on project sso-config-tests: Error during page generation: Error rendering Maven report: Could not generate the report: InvocationTargetException: Could not find any allure results -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-site-plugin:3.3:site (default-site) on project sso-config-tests: Error during page generation
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:216)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
        at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116)
        at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80)
        at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
        at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
        at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:307)
        at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:193)
        at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:106)
        at org.apache.maven.cli.MavenCli.execute(MavenCli.java:862)
        at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:286)
        at org.apache.maven.cli.MavenCli.main(MavenCli.java:197)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
        at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
        at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
        at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
Caused by: org.apache.maven.plugin.MojoExecutionException: Error during page generation
        at org.apache.maven.plugins.site.SiteMojo.execute(SiteMojo.java:143)
        at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
        ... 20 more
Caused by: org.apache.maven.doxia.siterenderer.RendererException: Error rendering Maven report: Could not generate the report
        at org.apache.maven.plugins.site.ReportDocumentRenderer.renderDocument(ReportDocumentRenderer.java:233)
        at org.apache.maven.doxia.siterenderer.DefaultSiteRenderer.renderModule(DefaultSiteRenderer.java:319)
        at org.apache.maven.doxia.siterenderer.DefaultSiteRenderer.render(DefaultSiteRenderer.java:135)
        at org.apache.maven.plugins.site.SiteMojo.renderLocale(SiteMojo.java:175)
        at org.apache.maven.plugins.site.SiteMojo.execute(SiteMojo.java:138)
        ... 22 more
Caused by: org.apache.maven.reporting.MavenReportException: Could not generate the report
        at ru.yandex.qatools.allure.report.AllureGenerateMojo.executeReport(AllureGenerateMojo.java:127)
        at org.apache.maven.reporting.AbstractMavenReport.generate(AbstractMavenReport.java:255)
        at org.apache.maven.plugins.site.ReportDocumentRenderer.renderDocument(ReportDocumentRenderer.java:219)
        ... 26 more
Caused by: java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)
        at ru.yandex.qatools.allure.report.AllureGenerateMojo.executeReport(AllureGenerateMojo.java:123)
        ... 28 more
Caused by: ru.yandex.qatools.allure.data.ReportGenerationException: Could not find any allure results
        at ru.yandex.qatools.allure.data.AllureReportGenerator.generate(AllureReportGenerator.java:58)
        at ru.yandex.qatools.allure.data.AllureReportGenerator.generate(AllureReportGenerator.java:53)
        at ru.yandex.qatools.allure.AllureMain.main(AllureMain.java:48)
        ... 33 more

【问题讨论】:

  • 插件在哪里定义了你想调试的地方?
  • @khmarbaise 插件在POM文件中定义。
  • 在哪个pom文件中?我没有看到 maven-surefire-plugin 等,但我假设我没有看到您喜欢对其运行测试的插件?此外,完整的 pom 文件或更好的完整示例项目(例如在 github 上)将有助于更多地了解问题所在?
  • 很好...很好...
  • @khmarbaise 我提供了更完整的 POM 和更多解释。现在更有意义了吗?

标签: maven maven-plugin allure


【解决方案1】:

如果您使用mvnDebug clean install 而不是mvn clean install 开始构建,Maven 将等待远程调试器连接到端口8000。这应该适用于所有不在自己的 JVM 中运行的插件。

这需要 Maven 大于 2.0.8,我假设您正在运行它。

Debugging in Maven?

【讨论】:

  • 不幸的是,它在连接到插件后并没有在插件的断点处停止。是的,我使用的是 Maven 3.3.1
  • 你确定你有插件的确切来源吗?我建议你在类级别设置一个断点。
  • 我在班级级别设置了断点。 maven 进程失败,JDWP exit error JVMTI_ERROR_WRONG_PHASE(112): on getting class status [util.c:1285] JDWP exit error JVMTI_ERROR_INVALID_ENVIRONMENT(116): Can't allocate jvmti memory [util.c:1799] ERROR: JDWP unable to dispose of JVMTI environment: JVMTI_ERROR_INVALID_ENVIRONMENT(116) FATAL ERROR in native method: JDWP Can't allocate jvmti memory, jvmtiError=JVMTI_ERROR_INVALID_ENVIRONMENT(116) /usr/local/bin/mvnDebug: line 41: 16470 Abort trap: 6 env MAVEN_OPTS="$MAVEN_OPTS $MAVEN_DEBUG_OPTS" $(dirname $0)/mvn "$@"
  • 这是 JDK[1] 中的一大亮点。该错误报告表明打算将修复移植到> Java 8.40,但我不确定这是否曾经发生过。 [1]bugs.openjdk.java.net/browse/JDK-6988950
  • 我用什么连接到端口 8000?什么远程调试器?
【解决方案2】:

如果你想从 Intellij IDEA 调试它。 我假设你运行捆绑的 mvn,JDK9+

  1. 转到 IDEA 中的 Maven Runner 设置。
  2. 在 VM Options 中指定这一行:-agentlib:jdwp=transport=dt_socket,address=5005,server=y,suspend=y

Maven 不会在您连接的那一刻继续进行 远程调试器。

  1. 创建远程调试器配置(指定端口 5005)。
  2. 运行远程调试器(不要忘记在代码中添加断点)。

【讨论】:

    【解决方案3】:

    您可能需要先修复配置问题,而不是 allure-maven 插件调试。您将插件放入错误的 pom 部分。见官方插件docs

    Allure 2 不再使用 reporting 部分。您应该将插件放入 build 部分。

    报告生成命令也已更新。而不是 site 目标调用,您应该使用以下内容:

    mvn allure:report
    mvn allure:serve
    

    查看this 示例以了解有效配置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-08
      • 1970-01-01
      相关资源
      最近更新 更多