java - Jacoco maven 插件使用 Exceptions-java.lang.IllegalStateException : class is already instrumented 阻塞控制台

标签 java powermock instrumentation jacoco-maven-plugin

我正在使用 Jacoco 插件和使用 power mock mockito 组合编写 JUnit 测试用例来处理声纳代码覆盖,而当我运行 mvn clean install 时,构建一切顺利,但控制台显示了一个非常非常长的堆栈跟踪链不断出现在项目中使用的许多类,并且非常烦人, 异常跟踪类似于以下 -

java.lang.instrument.IllegalClassFormatException: Error while instrumenting class..
Caused by: java.io.IOException: Error while instrumenting class.
Caused by: java.lang.IllegalStateException: Class <class-name> is already instrumented.

我通过以下链接寻求解决方案,但找不到出路:-

https://github.com/jacoco/jacoco/issues/32

该链接显示“该错误表明为同一进程配置了两个 JaCoCo 代理,看起来激活 surefire-report-plugin 会导致双重代理,这并非特例,但是 JVM 测试配置错误”在我的例子中,我猜它甚至没有加倍代理,因为我的 argLine 已设置为只有一个 jacoco 代理。

在我的例子中,argLine 设置为 below-

javaagent:C:\\Users\\user\\.m2\\repository\\org\\jacoco\\org.jacoco.agent\\0.7.6.201602180812\\org.jacoco.agent-0.7.6.201602180812-runtime.jar=destfile=C:Users\\user\\git\\package\\target\\jacoco.exec

我的 jacoco-sonar 配置的 pom.xml 条目如下 -

<properties>
        <sonar.sources>src/main/java</sonar.sources>
        <sonar.tests>src/test/java</sonar.tests>
        <sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin>
        <sonar.jacoco.reportPaths>${project.basedir}/target/jacoco.exec</sonar.jacoco.reportPaths>
        <sonar.language>java</sonar.language>
        <sonar.binaries>${project.basedir}/target/classes</sonar.binaries>
        <sonar.inclusions>
            **/com/abc/service/impl/ABCServiceImpl.java,
            **/com/abc/dao/impl/ABCDAOImpl.java
        </sonar.inclusions>
    </properties>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.20</version>
                <configuration>
                    <skipTests>false</skipTests>
                    <argLine>-Xmx1024m -XX:MaxPermSize=256m ${argLine}</argLine>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>0.7.6.201602180812</version>
                <executions>
                 <execution>
                        <id>default-prepare-agent</id>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                </execution> 
                <execution>
                    <id>default-instrument</id>
                    <goals>
                        <goal>instrument</goal>
                    </goals>
                </execution>
                <execution>
                    <id>default-restore-instrumented-classes</id>
                    <goals>
                        <goal>restore-instrumented-classes</goal>
                    </goals>
                </execution>
                    <execution>
                        <id>default-report</id>
                        <phase>prepare-package</phase>
                        <goals>
                            <goal>report</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

注意:如果我删除“default-instrument”和“default-restore-instrumented-classes”的执行元素,异常跟踪不会出现,但我在声纳上获得覆盖率 = 0.0%仪表板,使用这两个执行元素为我提供了正确的代码覆盖率,但在控制台上有冗长的堆栈跟踪。任何帮助表示赞赏。

最佳答案

根据我对这项研究的见解: 还可以将离线检测类与 JaCoCo Java 代理一起使用。在这种情况下,配置取自代理选项。必须以排除预检测类的方式配置代理,例如使用“excludes=*”。否则,如果代理在您的情况下再次检测此类,将导致控制台上出现错误消息。

代理 jacocoagent.jar 是 JaCoCo 发行版的一部分,包括所有必需的依赖项。可以使用以下 JVM 选项激活 Java 代理:

-javaagent:[yourpath/]jacocoagent.jar=[option1]=[value1],[option2]=[value2]

对于 JaCoCo 代理选项,请考虑以下链接: http://www.jacoco.org/jacoco/trunk/doc/agent.html

关于java - Jacoco maven 插件使用 Exceptions-java.lang.IllegalStateException : class is already instrumented 阻塞控制台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45560472/

相关文章:

java - Selenium 网络驱动程序 : Suppress IE log info prints on the console

Mockito:模拟类 <T> 对象

clang - 如何使用 clang 在另一个语句之前检测一个语句

java - 使用匿名类有什么害处?

java - 如何从文件中读取ArrayLists列表?

java - 使用 powermokito 模拟静态 Spring boot Controller 方法

java - 检测 Java 应用程序的执行(不仅仅是字节码)

java - 从 @UiThreadTest 调用 waitForMonitorWithTimeout()

java - 将eclipse的.classpath转换为gradle

java - 无法使用 PowerMockRunner 运行 JUnit 测试