[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
可能会复制过程中出错。
所以检查webapps
和build
目录的class
文件md5
,发现是一样的。可能不是这个问题。
之后又看到了一个帖子知道了javap
命令可以反汇编(此处用来验证class是否损坏),此时发现问题,javap data
命令得到了一个错误,Error: error while reading constant pool for data.class: unqxpected tag at #171: 109
这表示这个class
文件大概率是有问题的,并且指明了代码行数,还是错误的println
那一行。
根据提示,可能是字符常量池
出了问题,但是代码确实没有问题这点可以确定
尝试注释掉这行println
,ant
编译部署,发现问题解决了!
之后再取消注释,编译部署,代码也没问题了!
此时关注了一下编译前后class
文件大小,出问题的大小由10640
字节,没问题的class
文件有9568
字节,想来应该是class
文件坏掉了。只是正好坏到了字符常量池里面。
原因
问题怎么产生的想不到,可能是复制过程中程序出了问题,又或者是硬盘出现了坏块导致数据坏掉了。
猜测ant
只会编译变动过的代码文件,如果编译完成后class
文件坏掉了,代码文件又没有修改,那么这个坏掉的class
文件会被保留,并不会被覆盖掉,所以直接ant编译部署不好用。
tomcat 6.0.18
jdk 1.7.0_51
ant 1.9.3
Centos6.4