JaCoCo命令行界面(CLI)报告生成会导致:原因:java.lang.IllegalStateException:已检测到类$ CLASS

时间:2018-06-26 13:14:35

标签: 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测试:

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

为什么当我尝试生成报告时,是否收到有关已检测到的类的错误消息?

1 个答案:

答案 0 :(得分:0)

啊哈!我只是发现我应该使用非仪表型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.

我在此处发布了该错误,希望改善消息传递: https://github.com/jacoco/jacoco/issues/700