Интерфейс командной строки JaCoCo (CLI) Генерация отчета приводит к: Причины: java.lang.IllegalStateException: Класс $ CLASS уже инструментирован - PullRequest
0 голосов
/ 26 июня 2018

Я использую JUnit для проверки своего кода и доступа к закрытым методам / полям. Я использую отражение, которое не очень хорошо работает с инструментами JaCoCo на лету; Поэтому я начал заниматься автономной аппаратурой.

Я использую следующую команду для выполнения автономного инструментирования:

java.exe \
  -jar C:\jacoco\jacococli.jar \
  instrument \
  C:\project\main\main.jar \
  --dest C:\project\coverage

После этого я получаю инструментальный JAR здесь:

  • C: \ Проект \ охват \ 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 голосов
/ 26 июня 2018

Ах, ха! Я только что обнаружил, что должен использовать неинструментированный 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.jar вместо покрытия \ 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

...