Class ClassFormatError:Absent-Code-attribute-in-method-that-not-native

时间:2014-06-22 01:12:14

标签: java tomcat

我在tomcat 6.0.32和java 6上运行JSP项目,突然抛出了这个异常

java.lang.ClassFormatError: Absent Code attribute in method that is not native or abstract in class file com/company/secure/Account
java.lang.ClassLoader.defineClass1(Native Method)
java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
java.lang.ClassLoader.defineClass(ClassLoader.java:615)
java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2818)
org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1159)
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1647)
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1526)
org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:128)
org.apache.jasper.servlet.JasperLoader.loadClass(JasperLoader.java:66)
java.lang.Class.getDeclaredConstructors0(Native Method)
java.lang.Class.privateGetDeclaredConstructors(Class.java:2389)
java.lang.Class.getConstructor0(Class.java:2699)
java.lang.Class.newInstance0(Class.java:326)
java.lang.Class.newInstance(Class.java:308)
org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:150)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:338)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
filters.ObjectsCacheFilter.doFilter(ObjectsCacheFilter.java:43)
filters.FilterCach.doFilter(FilterCach.java:81)
filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:123)

注意Apache Tomcat / 6。0。3。3日志中提供了根本原因的完整堆栈跟踪。 Apache Tomcat / 6.0.32

1 个答案:

答案 0 :(得分:1)

问题是由于您的webapp(在本例中为JSP框架)尝试从仅API的JAR文件加载类。

这是问题的另一个例子(尽管可能是针对不同的Java EE API):

说明:某些Java EE API有两种形式:即2个不同的JAR文件:

  • 特定于平台的表单包含所有方法的代码。此JAR通常是Web容器的一部分,默认情况下包含在每个web-apps有效类路径中。

  • 仅限API的表单包含已删除其可执行代码的方法。此JAR由Oracle提供,允许您独立于任何特定的Java EE实现编译Java EE应用程序代码。

问题很可能是您已将其中一个仅限API的JAR放到Web应用程序的运行时类路径中,并且它优先于特定于平台的JAR。

鉴于这已经“突然发生”,我怀疑你一直在为你的项目改变Maven依赖项,并且(不小心)使一个仅API的JAR文件成为运行时依赖项而不是仅编译时依赖项。

解决方案:检查您的webapp的Maven(等)依赖项,或者如果您手动管理依赖项,请检查您放入webapp的WEB-INFO/lib目录和Web容器的共享库目录中的JAR。