SunOS5.10下crontab执行Java类报UnsupportedClassVersionError
问题根因
该报错本质是crontab执行脚本时调用的Java运行时版本,和你手动执行脚本时用的Java版本不匹配,和你用哪个JDK版本编译代码无关——手动执行能正常跑,就说明编译生成的class文件和你手动调用的JRE版本是兼容的,问题完全出在crontab的运行环境上。
crontab启动任务时不会加载任何用户shell的环境配置文件(包括/etc/profile、~/.bashrc、~/.profile等),默认PATH仅包含/usr/bin:/bin这类基础系统路径,你手动执行时生效的Java路径配置在crontab环境里完全不生效,最终会调用到路径下其他版本不匹配的Java二进制,触发类版本错误。
解决步骤
- 首先获取手动执行时使用的Java绝对路径,在登录shell中执行以下命令:
记录下校验通过的Java全路径,比如which java # 拿到路径后执行版本校验,确认输出为你预期的1.6版本 /上一步输出的Java全路径 -version/usr/jdk/jdk1.6.0_45/bin/java。 - 方案一(最稳妥,无环境依赖):直接修改调用Java类的bash脚本,把所有调用
java命令的位置替换为刚才记录的全路径,比如原脚本内容:
替换为:java com.xxx.YourMainClass/usr/jdk/jdk1.6.0_45/bin/java com.xxx.YourMainClass - 方案二:如果不想修改脚本内容,就在crontab配置中显式声明正确的环境变量,执行
crontab -e编辑定时任务,在所有任务条目最上方添加环境变量配置:# 替换为你实际使用的JDK 1.6安装根路径 JAVA_HOME=/usr/jdk/jdk1.6.0_45 PATH=$JAVA_HOME/bin:/usr/bin:/bin # 下方再写你的实际定时任务,注意脚本也要写全路径 0 2 * * * /opt/scripts/run_java_task.sh - 验证修复:临时添加一个1-2分钟后触发的测试任务,把标准输出和错误输出都重定向到临时日志,避免等定时周期浪费时间,示例:
任务触发后查看日志,确认没有类版本错误即为修复完成,记得删除临时测试任务。# 假设当前时间是14:25,就设置27分执行 27 14 * * * /opt/scripts/run_java_task.sh > /tmp/cron_java_test.log 2>&1
注意事项
SunOS 5.10通常会预装多个版本的JDK,/usr/bin/java一般是指向某个版本的软链接,和你登录shell中默认调用的Java版本不一定一致,哪怕你用Java 1.4编译代码,如果crontab调用到了更老的1.3版本JVM,一样会触发版本不兼容错误,因此绝对不要依赖crontab默认PATH查找Java命令,必须显式指定路径。
内容的提问来源于stack exchange,提问作者Prasad
相关产品推荐
相关产品推荐

