See You Again

记一次CLASSPATH引发的血案

最近迁移程序运行环境的时候,出现了一个莫名其妙的问题,一运行就抛异常:

  1. cannot access java.lang.Object
  2. bad class file: java/lang/Object.class(java/lang:Object.class)
  3. class file has wrong version 52.0, should be 50.0
  4. Please remove or make sure it appears in the correct subdirectory of the classpath.
  5. public class _auth__jsp extends com.caucho.jsp.JavaPage
  6. ^

在google上也了解了这个异常,大概意思是你Java程序的编译版本和运行版本不一致,例如程序在 java8 上编译,但是在 java6 上运行,这时就会出现这种错误。

可是我反复check了jenkins的打包、运行脚本,都明确了使用 jdk8,中途也都打印了版本号出来java -version,并没有什么不对。

经过不断的回滚,我发现相同的包,在A账号下正常,但是到B账号下就不行了!仔细对比两个账号的运行环境,发现A账号多了一个环境变量的设置:

  1. export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

而这个变量加到B账号上以后,就恢复了正常!查看B账号上原来的 CLASSPATH 值,竟然是这个:

  1. .:/usr/local/jdk1.6.0_23/lib/dt.jar:/usr/local/jdk1.6.0_23/lib/tools.jar:/usr/local/jdk1.6.0_23/jre/lib/rt.jar

原来在 /etc/profile 里面指定了一个低版本的 java ,CLASSPATH 也对应这个低版本的 java!

  1. export JAVA_HOME=/usr/local/jdk1.6.0_23
  2. CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/jre/lib/rt.jar

至此问题豁然开朗,升级 java 版本的时候没有从系统层面升级,只是从账号层面,然而相关的路径等环境变量并没有匹配,导致使用了低版本的java去运行高版本的程序。

这是一起花式虐汪:sob:

2017-04-21 喜欢

Copyright © 2015-2018 转载请注明出处

回到顶部 ↑