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系统上的日志文件大小达到了
(!),这是不可接受的。我们的CI机器上的此类日志占用了大量可用空间李>50Mb
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.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]