[java] Tomcat 启动失败 Error: error while reading constant pool for .class: unexpected tag at #

表现

公司服务器今天启动tomcat失败,
catalina.out文件里面报错 java.lang.ClassFormatError: Unknown constant tag 101 in class file cn/world/data

尝试解决

查了一下,网上一般认为是字符串的问题,但是代码文件目标行是英文字符串,只是简单的println了字符串,应该不会有问题。尤其是这些代码都没变动过。
之后考虑了一下class文件可能损坏的可能,https://www.java-forum.org/thema/kein-zugriff-auf-inhalt-einer-referenzierten-jar.131247/ 中提到某些版本ant可能会复制过程中出错。
所以检查webappsbuild目录的class文件md5,发现是一样的。可能不是这个问题。

之后又看到了一个帖子知道了javap命令可以反汇编(此处用来验证class是否损坏),此时发现问题,javap data命令得到了一个错误,Error: error while reading constant pool for data.class: unqxpected tag at #171: 109
这表示这个class文件大概率是有问题的,并且指明了代码行数,还是错误的println那一行。
根据提示,可能是字符常量池出了问题,但是代码确实没有问题这点可以确定
尝试注释掉这行printlnant编译部署,发现问题解决了!
之后再取消注释,编译部署,代码也没问题了!

此时关注了一下编译前后class文件大小,出问题的大小由10640字节,没问题的class文件有9568字节,想来应该是class文件坏掉了。只是正好坏到了字符常量池里面。

原因

问题怎么产生的想不到,可能是复制过程中程序出了问题,又或者是硬盘出现了坏块导致数据坏掉了。
猜测ant只会编译变动过的代码文件,如果编译完成后class文件坏掉了,代码文件又没有修改,那么这个坏掉的class文件会被保留,并不会被覆盖掉,所以直接ant编译部署不好用。

tomcat 6.0.18
jdk 1.7.0_51
ant 1.9.3
Centos6.4

作者:cjdty

出处:https://www.cnblogs.com/cjdty/p/18006708

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   Startu  阅读(100)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
more_horiz
keyboard_arrow_up light_mode palette
选择主题
点击右上角即可分享
微信分享提示