Ява.яз..RuntimeException: java.яз..ClassNotFoundException:


Я получаю следующее исключение с новой cobertura (2.0.2..) . Я думаю, что это как-то связано с созданием нового объекта сразу в новом блоке.

WARN   instrumentClass, Unable to instrument file c:appsijprojectsTrickyInstrumentoutproductionTrickyInstrumentInstrumentationFailsOnFirstNewClassInTryBlock.class
java.lang.RuntimeException: java.lang.ClassNotFoundException: DataAccess
        at org.objectweb.asm.ClassWriter.getCommonSuperClass(Unknown Source)
        at org.objectweb.asm.ClassWriter.a(Unknown Source)
        at org.objectweb.asm.Frame.a(Unknown Source)
        at org.objectweb.asm.Frame.a(Unknown Source)
        at org.objectweb.asm.MethodWriter.visitMaxs(Unknown Source)
        at org.objectweb.asm.MethodVisitor.visitMaxs(Unknown Source)
        at org.objectweb.asm.util.CheckMethodAdapter.visitMaxs(Unknown Source)
        at org.objectweb.asm.MethodVisitor.visitMaxs(Unknown Source)
        at org.objectweb.asm.commons.LocalVariablesSorter.visitMaxs(Unknown Source)
        at org.objectweb.asm.tree.MethodNode.accept(Unknown Source)
        at org.objectweb.asm.util.CheckMethodAdapter$1.visitEnd(Unknown Source)
        at org.objectweb.asm.MethodVisitor.visitEnd(Unknown Source)
        at org.objectweb.asm.util.CheckMethodAdapter.visitEnd(Unknown Source)
        at org.objectweb.asm.ClassReader.b(Unknown Source)
        at org.objectweb.asm.ClassReader.accept(Unknown Source)
        at org.objectweb.asm.ClassReader.accept(Unknown Source)
        at net.sourceforge.cobertura.instrument.CoberturaInstrumenter.instrumentClass(CoberturaInstrumenter.java:204)
        at net.sourceforge.cobertura.instrument.CoberturaInstrumenter.instrumentClass(CoberturaInstrumenter.java:121)
        at net.sourceforge.cobertura.instrument.CoberturaInstrumenter.addInstrumentationToSingleClass(CoberturaInstrumenter.java:233)
        at net.sourceforge.cobertura.instrument.Main.addInstrumentationToSingleClass(Main.java:274)
        at net.sourceforge.cobertura.instrument.Main.addInstrumentation(Main.java:283)
        at net.sourceforge.cobertura.instrument.Main.addInstrumentation(Main.java:292)
        at net.sourceforge.cobertura.instrument.Main.parseArguments(Main.java:373)
        at net.sourceforge.cobertura.instrument.Main.main(Main.java:395)
8 Jul, 2013 2:05:07 PM net.sourceforge.cobertura.coveragedata.CoverageDataFileHandler saveCoverageData
INFO: Cobertura: Saved information on 2 classes.

Ниже приведен код, относящийся к вышеуказанному исключению.

public class InstrumentationFailsOnFirstNewClassInTryBlock {


    public void saveToDatabase() {
        //
        try {
//            boolean b=false;
//            if ( b) {
//                System.out.println("no action");
//            }
            DataAccess da = new DataAccess();
            System.out.println("nothing");

        } catch (Exception e) {


        }
    }
}
  class DataAccess {
    public DataAccess() {
        //To change body of created methods use File | Settings | File Templates.
    }
}

Если я откомментирую блок кода некоторыми фиктивными операторами, ТО инструментирование работает нормально. Разве кто-нибудь это видел? Какие-нибудь потенциальные исправления?

Edit: ошибка возникает с java6 и java7.

3 4

3 ответа:

У меня была похожая проблема, и это может быть ошибка, см.: https://github.com/cobertura/cobertura/issues/49

Ваш тестовый случай может быть полезен для отладки проблемы...

Первоначальная проблема была связана с дефектом Cobertura. Она не фиксирована. Апартаменты cobertura теперь поддерживает дополнительный аргумент для вспомогательных классов.. Это будет использоваться для разрешения любых классов, необходимых для инструментирования.

Документация задачи Cobertura-ant

Добавление auxClasspath

Аргумент AuxClasspath предназначен для удаления исключения ClassNotFoundException во время приборостроения. Видеть https://github.com/cobertura/cobertura/wiki/FAQ#classnotfoundexception-during-instrumentation для получения дополнительной информации об этом аргументе

От https://github.com/cobertura/cobertura/wiki/FAQ#classnotfoundexception-during-instrumentation:

" это потому, что во время инструментирования в cobertura 2.0 мы используем ASM для восстановления .файл класса. Мы перестраиваем stackmap, который является обязательным требованием для совместимости с java 7 и всем, что после этого. Это не означает, что мы перекомпилируем код, однако ASM требует, чтобы мы предоставили двоичные файлы других классов на тот случай, если ему потребуется искать какие-либо супер методы. Фиксировать для этого мы используем аргумент auxClasspath."

Добавление следующего кода в файл ant (build.xml) должен решить эту проблему.

<path id="cobertura.auxpath">
<pathelement location="${bin}"/>
    </path>

    <target name="instrument_coverage" depends="init_coverage"
        description="Instruments source code for coverage measurement">
        <cobertura-instrument datafile="${coverage.datafile}">
            <fileset refid="coverage-files"/>
        <auxClasspath>
              <path refid="cobertura.auxpath" />
            </auxClasspath>
        </cobertura-instrument>
    </target>
Это сработало для меня.