JaCoCo命令行界面(CLI)报告生成导致:由以下原因引起:java.lang.IllegalStateException:已检测到类$Class

JaCoCo命令行界面(CLI)报告生成导致:由以下原因引起:java.lang.IllegalStateException:已检测到类$Class,java,junit,report,code-coverage,jacoco,Java,Junit,Report,Code Coverage,Jacoco,我使用JUnit来测试我的代码并访问私有方法/字段,我使用的反射与JaCoCo动态检测不兼容;因此,我开始做离线检测 我使用以下命令执行离线检测: java.exe \ -jar C:\jacoco\jacococli.jar \ instrument \ C:\project\main\main.jar \ --dest C:\project\coverage 在此之后,我在这里结束了插入仪器的JAR: C:\project\coverage\main.jar 然后在我提

我使用JUnit来测试我的代码并访问私有方法/字段,我使用的反射与JaCoCo动态检测不兼容;因此,我开始做离线检测

我使用以下命令执行离线检测:

java.exe \
  -jar C:\jacoco\jacococli.jar \
  instrument \
  C:\project\main\main.jar \
  --dest C:\project\coverage
在此之后,我在这里结束了插入仪器的JAR:

  • C:\project\coverage\main.jar
然后在我提供的类路径上运行JUnit测试:

C:\jacoco\jacocoagent.jar;C:\project\coverage\main.jar;...
这似乎很好,因为我最终得到了我期望的jacoco.exec文件

当我尝试使用以下命令生成此jacoco.exec文件的报告时:

java.exe \
  -jar C:\jacoco\jacococli.jar \
  report \
  C:\project\coverage\jacoco.exec \
  --classfiles C:\project\coverage\main.jar \
  --html C:\project\coverage\report
然后,我收到此错误消息:

Exception in thread "main" java.io.IOException: Error while analyzing C:\project\coverage\main.jar@my/package/MyClass.class.
        at org.jacoco.cli.internal.core.analysis.Analyzer.analyzerError(Analyzer.java:166)
        at org.jacoco.cli.internal.core.analysis.Analyzer.analyzeClass(Analyzer.java:138)
        at org.jacoco.cli.internal.core.analysis.Analyzer.analyzeClass(Analyzer.java:161)
        at org.jacoco.cli.internal.core.analysis.Analyzer.analyzeAll(Analyzer.java:197)
        at org.jacoco.cli.internal.core.analysis.Analyzer.analyzeZip(Analyzer.java:269)
        at org.jacoco.cli.internal.core.analysis.Analyzer.analyzeAll(Analyzer.java:200)
        at org.jacoco.cli.internal.core.analysis.Analyzer.analyzeAll(Analyzer.java:230)
        at org.jacoco.cli.internal.commands.ClassInfo.execute(ClassInfo.java:58)
        at org.jacoco.cli.internal.Main.execute(Main.java:89)
        at org.jacoco.cli.internal.Main.main(Main.java:104)
Caused by: java.lang.IllegalStateException: Class my/package/MyClass is already instrumented.
        at org.jacoco.cli.internal.core.internal.instr.InstrSupport.assertNotInstrumented(InstrSupport.java:176)
        at org.jacoco.cli.internal.core.internal.analysis.ClassAnalyzer.visitField(ClassAnalyzer.java:85)
        at org.jacoco.cli.internal.asm.ClassVisitor.visitField(ClassVisitor.java:294)
        at org.jacoco.cli.internal.asm.ClassReader.readField(ClassReader.java:883)
        at org.jacoco.cli.internal.asm.ClassReader.accept(ClassReader.java:694)
        at org.jacoco.cli.internal.asm.ClassReader.accept(ClassReader.java:500)
        at org.jacoco.cli.internal.core.analysis.Analyzer.analyzeClass(Analyzer.java:120)
        at org.jacoco.cli.internal.core.analysis.Analyzer.analyzeClass(Analyzer.java:136)
        ... 8 more

为什么,当我尝试生成报告时,会收到有关已插入指令的类的错误消息?

啊哈!我刚刚发现我应该使用非仪器化的JAR来生成报告

java.exe \
  -jar C:\jacoco\jacococli.jar \
  report \
  C:\project\coverage\jacoco.exec \
  --classfiles C:\project\main\main.jar \
  --html C:\project\coverage\report
注意:main\main.jar而不是coverage\main.jar

我通过尝试运行以下命令发现了这一点:

java.exe \
  -jar C:\jacoco\jacococli.jar \
  classinfo \
  C:\project\coverage\main.jar
产生了相同的错误:

Caused by: java.lang.IllegalStateException: Class my/package/MyClass is already instrumented.
我在这里发布了这个bug,希望能够改进消息传递: