我在启动Web应用程序时遇到异常,因为guice正在尝试构建所提到的类。
java.lang.VerifyError: Inconsistent stackmap frames at branch target 2770 in method com.aptusi.apps.magazine.api.servlet.internal.EditorServlet.service(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;Ljava/lang/String;Lcom/aptusi/persistence/runtime/framework/DboSession;)V at offset 200
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2483)
at java.lang.Class.getDeclaredConstructors(Class.java:1891)
at com.google.inject.spi.InjectionPoint.forConstructorOf(InjectionPoint.java:243)
at com.google.inject.internal.ConstructorBindingImpl.create(ConstructorBindingImpl.java:96)
at com.google.inject.internal.InjectorImpl.createUninitializedBinding(InjectorImpl.java:629)
at com.google.inject.internal.InjectorImpl.createJustInTimeBinding(InjectorImpl.java:845)
at com.google.inject.internal.InjectorImpl.createJustInTimeBindingRecursive(InjectorImpl.java:772)
at com.google.inject.internal.InjectorImpl.getJustInTimeBinding(InjectorImpl.java:256)
at com.google.inject.internal.InjectorImpl.getBindingOrThrow(InjectorImpl.java:205)
at com.google.inject.internal.InjectorImpl.getBinding(InjectorImpl.java:146)
at com.google.inject.internal.InjectorImpl.getBinding(InjectorImpl.java:66)
at com.google.inject.servlet.ServletDefinition.init(ServletDefinition.java:103)
at com.google.inject.servlet.ManagedServletPipeline.init(ManagedServletPipeline.java:82)
at com.google.inject.servlet.ManagedFilterPipeline.initPipeline(ManagedFilterPipeline.java:102)
at com.google.inject.servlet.GuiceFilter.init(GuiceFilter.java:172)`
我知道-XX:-UseSplitVerifier和-noverify jvm选项,但我不想使用,因为我想确保此项目中的所有代码至少是java版本7。
为了做到这一点,了解我的代码中究竟发生了什么是有用的,我不清楚所提到的200的偏移是什么,但是它可以与行号相关吗?
也有人知道我可以找到我的类路径上所有类的java版本的方法,我使用maven所以有很多依赖项,所以我正在寻找一种自动查找任何类的方法在类路径上可能已编译为低于1.7的java版本?
答案 0 :(得分:1)
要查找类文件的版本,只需查看类文件的第8个字节。对于Java 7类,它将是51。像ASM这样的框架将为您完成此任务。
就错误而言,这意味着您的类文件格式错误。你是如何创建这些类的?你做过字节码操作吗?如果是这样,您的代码中可能存在错误。