【问题标题】:java.lang.RuntimeException: java.lang.ClassNotFoundException: <org.objectweb.asm.ClassWriter.getCommonSuperClass(Unknown Source)>java.lang.RuntimeException: java.lang.ClassNotFoundException: <org.objectweb.asm.ClassWriter.getCommonSuperClass(Unknown Source)>
【发布时间】:2013-07-08 08:47:36
【问题描述】:

我收到新的cobertura (2.0.2..) 的以下异常。我想这与在新块中立即创建新对象有关。

WARN   instrumentClass, Unable to instrument file c:\apps\ijprojects\TrickyInstrument\out\production\TrickyInstrument\InstrumentationFailsOnFirstNewClassInTryBlock.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.
    }
}

如果我取消注释代码块中的一些虚拟语句,则检测工作正常。有人见过这个吗?任何潜在的修复?

编辑:java6 和 java7 发生错误。

【问题讨论】:

    标签: java java-7 cobertura


    【解决方案1】:

    最初的问题是由于 Cobertura 缺陷造成的。它不是固定的。 Cobertura 现在支持auxillary classpath. 的附加参数。这将用于解析检测所需的任何类。

    cobertura-ant task documentation

    添加辅助类路径

    auxClasspath 参数旨在删除 ClassNotFoundException 在仪器仪表。看 https://github.com/cobertura/cobertura/wiki/FAQ#classnotfoundexception-during-instrumentation 有关此论点的更多信息

    【讨论】:

      【解决方案2】:

      我遇到了类似的问题,可能是错误,请参阅:https://github.com/cobertura/cobertura/issues/49

      您的测试用例可能有助于调试问题...

      【讨论】:

        【解决方案3】:

        来自https://github.com/cobertura/cobertura/wiki/FAQ#classnotfoundexception-during-instrumentation

        "这是因为在 cobertura 2.0 的插桩过程中,我们使用 ASM 来重建 .class 文件。我们重建了堆栈映射,这是与 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>
        

        这对我有用。

        【讨论】:

          猜你喜欢
          • 2015-11-14
          • 2017-12-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-17
          • 2015-12-27
          相关资源
          最近更新 更多