Ява.яз..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 ответа:
У меня была похожая проблема, и это может быть ошибка, см.: 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>