Java 声纳(jacoco)和#x2B;jmockit垃圾信息有例外

Java 声纳(jacoco)和#x2B;jmockit垃圾信息有例外,java,sonarqube,jmockit,jacoco,Java,Sonarqube,Jmockit,Jacoco,我正面临一个令人恼火的错误。 以下是我所拥有的: 1) Sonar 3.5使用JaCoCo作为覆盖工具。 2) Jmockit lib使用mock执行测试。 3) 使用maven自动生成过程 因此,当我首先运行mvn clean install这是正常的,然后我运行mvn sonar:sonar,这里发生了什么: Jmockit似乎是它所需要的工具类 JaCoCo不能对已经被Jmockit插装的类进行插装,并抛出大量异常,说不可能对已经被插装的类进行插装。 然而,对于这种情况,声纳似乎有一个有

我正面临一个令人恼火的错误。
以下是我所拥有的: 1) Sonar 3.5使用JaCoCo作为覆盖工具。 2) Jmockit lib使用mock执行测试。 3) 使用maven自动生成过程

因此,当我首先运行
mvn clean install
这是正常的,然后我运行
mvn sonar:sonar
,这里发生了什么:

  • Jmockit似乎是它所需要的工具类
  • JaCoCo不能对已经被Jmockit插装的类进行插装,并抛出大量异常,说不可能对已经被插装的类进行插装。 然而,对于这种情况,声纳似乎有一个有效的输出。
    所以第一个问题是:我能以某种方式抑制这种异常吗?这非常关键,因为我们的CI系统上的日志文件大小达到了
    50Mb
    (!),这是不可接受的。我们的CI机器上的此类日志占用了大量可用空间
以下是我得到的例外情况:

java.lang.instrument.IllegalClassFormatException: Error while instrumenting class app/MyClass.
Caused by: java.lang.IllegalStateException: Class app/MyClass is already instrumented.
假设抑制这样的异常是不可能的,我对它进行了一点调查,发现JaCoCo(Sonar使用的工具和无法检测已检测的类的工具)具有
脱机检测
(AFAIK Sonar既不支持此
离线仪器
,也不能抑制此类警告).这个东西就是专门为这种情况设计的。所以我尝试在maven中将JaCoCo设置为插件,但我没有成功,因为JaCoCo找不到执行文件。当我运行
mvn clean install
时,会弹出以下错误:

[信息]---JacocoMaven插件:0.6.2.201302030002:report(report)@webservice-mws--- [INFO]由于缺少执行数据文件,正在跳过JaCoCo执行

如果我没有弄错的话,这个执行文件是JaCoCo插件的结果。我完全沮丧,不知道该怎么办

如果有人能帮我,我将不胜感激!
提前谢谢

JaCoCo插件的my pom.xml设置:

             <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>0.6.2.201302030002</version>
                <executions>
                    <execution>
                        <phase>process-test-resources</phase>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>report</id>
                        <phase>verify</phase>
                        <goals>
                            <goal>report</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

org.jacoco
jacocomaven插件
0.6.2.201302030002
过程测试资源
配制剂
报告
验证
报告
据我所知,消息“Class app/MyClass已检测”。表示该类已由JaCoCo检测。以下是可能发生这种情况的一些原因:

  • 脱机检测与联机检测混合使用-它们应专门使用
  • 在测试过程中,两个JaCoCo代理连接到JVM——这可能会发生,因为Sonar尝试自动连接JaCoCo代理并执行测试,而JaCoCo maven插件也会连接代理,因此为了避免这种情况,请查看属性“Sonar.dynamicAnalysis=reUserReports”或不要使用Jacoo maven插件,Sonar将自行完成这项工作
对我来说,您的信息在理解配置方面似乎有点挑战性,所以我不能确切地说您正面临上述哪种情况,但我打赌是第二种情况


希望这些信息对您有用。如果这无助于您解决问题,请随时返回Sonar用户邮件列表。

您可以使用Cobertura作为Sonar 3.5.1的代码覆盖范围

要更改它,请执行以下操作:

  • 以管理员身份登录
  • 转到设置>配置
  • 在常规设置类别>Java中
  • 设置代码覆盖率插件=cobertura
  • 在我的项目中工作得很有魅力^-

    问题是JMockit“重新加载”类以模拟它们。然后JaCoCo尝试再次插入它们。就在这时,错误发生了

    注意:模拟接口不会发生这种情况

    运行EclEmma+JaCoCo时,请参阅以下stacktrace

    java.lang.instrument.IllegalClassFormatException: Error while instrumenting class com/company/AbstractClass.
        at org.jacoco.agent.rt.internal_9dd1198.CoverageTransformer.transform(CoverageTransformer.java:89)
        at sun.instrument.TransformerManager.transform(TransformerManager.java:188)
        at sun.instrument.InstrumentationImpl.transform(InstrumentationImpl.java:424)
        at sun.instrument.InstrumentationImpl.redefineClasses0(Native Method)
        at sun.instrument.InstrumentationImpl.redefineClasses(InstrumentationImpl.java:170)
        at mockit.internal.startup.Startup.redefineMethods(Startup.java:260)
        at mockit.internal.RedefinitionEngine.redefineClasses(RedefinitionEngine.java:26)
        at mockit.internal.expectations.mocking.BaseTypeRedefinition.redefineClass(BaseTypeRedefinition.java:172)
        at mockit.internal.expectations.mocking.BaseTypeRedefinition.redefineClassAndItsSuperClasses(BaseTypeRedefinition.java:147)
        at mockit.internal.expectations.mocking.BaseTypeRedefinition.redefineMethodsAndConstructorsInTargetType(BaseTypeRedefinition.java:134)
        at mockit.internal.expectations.mocking.BaseTypeRedefinition.redefineTargetClassAndCreateInstanceFactory(BaseTypeRedefinition.java:197)
        at mockit.internal.expectations.mocking.BaseTypeRedefinition.redefineType(BaseTypeRedefinition.java:57)
        at mockit.internal.expectations.mocking.TypeRedefinition.redefineType(TypeRedefinition.java:47)
        at mockit.internal.expectations.mocking.SharedFieldTypeRedefinitions.redefineTypeForMockField(SharedFieldTypeRedefinitions.java:60)
        at mockit.internal.expectations.mocking.FieldTypeRedefinitions.redefineFieldType(FieldTypeRedefinitions.java:48)
        at mockit.internal.expectations.mocking.FieldTypeRedefinitions.redefineFieldTypes(FieldTypeRedefinitions.java:38)
        at mockit.internal.expectations.mocking.SharedFieldTypeRedefinitions.redefineTypesForTestClass(SharedFieldTypeRedefinitions.java:43)
        at mockit.integration.internal.TestRunnerDecorator.handleMockFieldsForWholeTestClass(TestRunnerDecorator.java:135)
        at mockit.integration.internal.TestRunnerDecorator.updateTestClassState(TestRunnerDecorator.java:34)
        at mockit.integration.junit4.internal.JUnit4TestRunnerDecorator.handleMockingOutsideTestMethods(JUnit4TestRunnerDecorator.java:107)
        at mockit.integration.junit4.internal.JUnit4TestRunnerDecorator.invokeExplosively(JUnit4TestRunnerDecorator.java:37)
        at mockit.integration.junit4.internal.MockFrameworkMethod.invokeExplosively(MockFrameworkMethod.java:32)
        at sun.reflect.GeneratedMethodAccessor27.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:606)
        at mockit.internal.util.MethodReflection.invokeWithCheckedThrows(MethodReflection.java:106)
        at mockit.internal.mockups.MockMethodBridge.callMock(MockMethodBridge.java:85)
        at mockit.internal.mockups.MockMethodBridge.invoke(MockMethodBridge.java:44)
        at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java)
        at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
        at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
        at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
        at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
    Caused by: java.io.IOException: Error while instrumenting class com/afklm/cco/slt/integrator/batch/AbstractData.
        at org.jacoco.agent.rt.internal_9dd1198.core.instr.Instrumenter.instrumentError(Instrumenter.java:147)
        at org.jacoco.agent.rt.internal_9dd1198.core.instr.Instrumenter.instrument(Instrumenter.java:98)
        at org.jacoco.agent.rt.internal_9dd1198.CoverageTransformer.transform(CoverageTransformer.java:87)
        ... 44 more
    Caused by: java.lang.IllegalStateException: Class com/company/AbstractClass is already instrumented.
        at org.jacoco.agent.rt.internal_9dd1198.core.internal.instr.InstrSupport.assertNotInstrumented(InstrSupport.java:81)
        at org.jacoco.agent.rt.internal_9dd1198.core.internal.instr.ClassInstrumenter.visitField(ClassInstrumenter.java:79)
        at org.jacoco.agent.rt.internal_9dd1198.asm.ClassVisitor.visitField(Unknown Source)
        at org.jacoco.agent.rt.internal_9dd1198.asm.ClassReader.a(Unknown Source)
        at org.jacoco.agent.rt.internal_9dd1198.asm.ClassReader.accept(Unknown Source)
        at org.jacoco.agent.rt.internal_9dd1198.asm.ClassReader.accept(Unknown Source)
        at org.jacoco.agent.rt.internal_9dd1198.core.instr.Instrumenter.instrument(Instrumenter.java:78)
        at org.jacoco.agent.rt.internal_9dd1198.core.instr.Instrumenter.instrument(Instrumenter.java:96)
        ... 45 more
    

    我也遇到了同样的问题。它似乎在jacoco插件0.7.1+中得到了修复。我使用的是0.7.3.20150219951,问题就消失了

    基本上,jMockit代理会在JaCoCo代理看到类之前加载类并重新转换它们。之后,JaCoCo将无法再执行所需的检测。请参阅此链接


    根据我对这项研究的了解:也可以将离线插装类与JaCoCo Java代理一起使用。在这种情况下,配置取自代理选项。必须以排除预插装类的方式配置代理,例如使用“excludes=*”。否则,如果代理在您的案例中再次插入此类类,则会在控制台上显示错误消息。 Jacoco插件条目:-

    <configuration> 
         <excludes> 
              <exclude>*</exclude> 
         </excludes> 
    </configuration>
    
    对于JACCOO代理选项,考虑以下链接:


    由于代理jacocagent.jar是JaCoCo发行版的一部分,它会自动包含在argLine参数中,不需要显式设置,但我们应该验证在执行mvn clean install命令时jacocagent.jar是否在argLine中显示为setking framework,你可以引用@Dennis,是的,这里唯一的解决方案似乎是将sonar切换到另一个代码覆盖工具,如Cobertura。
    -javaagent:[yourpath/]jacocoagent.jar=[option1]=[value1],[option2]=[value2]