Tomcat在启动时突然抛出ClassFormatError错误

4
我在项目中遇到了问题,经过一些测试我认为不是源代码的问题。即使返回一个之前工作的版本,当我尝试部署到Tomcat时仍然会出现错误。
错误信息是org.springframework.beans.factory.BeanDefinitionStoreException,由于java.lang.ClassFormatError引起,消息为Truncated class file
我已经开始通过删除Eclipse来缩小问题范围,但即使使用maven命令行构建并直接部署到我的tomcat实例,我仍然遇到相同的问题。谷歌搜索错误时有人建议清除tomcat的work和temp目录,我也这样做了,但没有用。
我知道这里提供的信息不多,但是假设问题不在我的代码中,那么对我的系统进行哪些更改可能导致突然出现此问题?
堆栈跟踪
Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from class path resource [beans.xml]; nested exception is java.lang.ClassFormatError: Truncated class file
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:412)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:174)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:209)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.importBeanDefinitionResource(DefaultBeanDefinitionDocumentReader.java:239)
    ... 54 more
Caused by: java.lang.ClassFormatError: Truncated class file
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
    at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:1847)
    at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:890)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1354)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233)
    at org.apache.xbean.spring.context.v2c.XBeanQNameHelper.loadClass(XBeanQNameHelper.java:102)
    at org.apache.xbean.spring.context.v2c.XBeanQNameHelper.getBeanInfo(XBeanQNameHelper.java:72)
    at org.apache.xbean.spring.context.v2c.XBeanNamespaceHandler.getPropertyDescriptor(XBeanNamespaceHandler.java:581)
    at org.apache.xbean.spring.context.v2c.XBeanNamespaceHandler.addAttributeProperties(XBeanNamespaceHandler.java:333)
    at org.apache.xbean.spring.context.v2c.XBeanNamespaceHandler.parseBeanFromExtensionElement(XBeanNamespaceHandler.java:225)
    at org.apache.xbean.spring.context.v2c.XBeanNamespaceHandler.parseBeanFromExtensionElement(XBeanNamespaceHandler.java:276)
    at org.apache.xbean.spring.context.v2c.XBeanNamespaceHandler.parse(XBeanNamespaceHandler.java:156)
    at org.apache.xbean.spring.context.v2.XBeanNamespaceHandler.parse(XBeanNamespaceHandler.java:49)
    at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1419)
    at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1409)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:184)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:140)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:111)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:493)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:390)
    ... 59 more
9个回答

5
看起来其中一个类文件已损坏,但问题在于找出哪一个。
一种调试方法是使用eclipse的异常中断功能。启动tomcat,让它等待调试器运行之前附加, 然后在java.lang.ClassFormatError抛出时中断,并在eclipse中查看本地变量和堆栈,以查看哪个类未能加载。

谢谢,我明天会试试看。即使进行完整的构建,为什么一个类文件会一直损坏呢?也许我的Artifactory出了些问题。 - James McMahon
可能只是您驱动器上的坏扇区,也可能更加复杂,但很难确定问题所在。 - havexz
1
是的,我的本地Maven仓库中的ActiveMQ类文件不知何故已经损坏。从仓库中删除这些文件解决了问题。谢谢。 - James McMahon
我们只有一个应用程序存在问题。本地一切正常,但是当我们部署到其他区域时,会出现错误。有时重新启动服务器可以解决问题,有时则会导致错误。这可能与Tomcat war文件解压有关? - user6408185

4
如果您正在运行JSP,只需进入TOMCAT_HOME/work/Catalina/localhost/目录,查找您的Web应用程序的名称,进入该目录并一直向下浏览目录树,直到找到JSP类文件。然后执行sudo rm -f * 命令,然后再尝试一次。无需重新安装或重建任何内容,因为您所做的一切都没有损坏。有时编译器会感到困惑。

0

我尝试了很多方法来解决这个问题,但最终发现它并不是损坏的 .class 文件的问题。这些损坏的 .class 文件存储在您的本地服务器(Tomcat7 等)中。

  1. 请删除您的服务器。
  2. 清理您的项目(在菜单栏中:项目 --> 清理)
  3. 将其重新添加到您的 Eclipse 中。
  4. 使用 Maven 进行项目清理和安装。
  5. 运行您的项目。

愉快编码!


0

是的,我正在处理的最后一个文件类可能会导致应用程序运行出现问题。我从主类中取消了对该类文件的调用,现在一切正常。


0
我删除了目标文件夹,进行了清理编译,现在一切都正常了。

0

我曾经遇到过完全相同的问题。所有的 Web 应用程序都会抛出相同的异常,它们不可能全部损坏。我还尝试过删除和重新部署 WAR 文件,检查磁盘是否有坏道等方法。最终通过卸载并重新安装 Tomcat7 解决了问题。

apt-get purge tomcat7
apt-get install tomcat7

根本原因仍然是个谜。

0

这个问题已经很老了,但是我还清楚地记得尽管它是4年前的事情。

在这种情况下,这个问题的根本原因是我的硬盘由于固件问题而受损。我在其他情况下也遇到过类似的问题,由于内存故障或其他原因导致磁盘故障。

我之所以在这么长时间之后发布这篇文章,是因为我看到很多针对此问题的本地化解决方案。你的情况可能不同,即使没有完全的磁盘或内存故障,也可能发生数据损坏,因此请将这个答案视为公共服务广告。

如果您遇到此类问题或类似问题,请花些时间检查您的磁盘和RAM的完整性。这些类型的问题可能只是冰山一角。


0
问题在于您的类文件/包含类文件的jar文件已损坏。找到您遇到此错误的类所在的包。如果是您的文件,请清理并重新构建,这应该可以解决问题。如果问题是由于任何外部包引起的,请重新下载它,这应该可以解决您的问题。
如果您正在使用Maven,请删除本地m2存储库并重新构建。

0

如果您正在处理的类文件损坏,就会出现此类错误。如果问题出在您正在处理的类文件上,只需进行一次清理构建即可解决问题。

如果错误是由于第三方JAR/API引起的,则重新下载相同的文件通常可以解决问题。

如果您正在使用构建工具/框架,则删除现有存储库并重新运行该工具。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接