先描述一下当时头疼的问题:服务器端有三个服务是使用shell脚本启动,而出现问题的就是batch的脚本。batch脚本启动后一切功能运行正常,但有时就会出现“NoClassFounder”的异常,刚开始以为是打包的问题,于是将服务器上的代码拿下来检查,我就日了什么,对应的Class是存在的啊!可是为什么不生效,但当时也不知是什么原因,解决办法就是重启batch的shell脚本。
#!/bin/ksh
APPID=`basename $0 .sh`
STAMP=`date +%Y%m%d%H%M%S`
echo ============================
echo Loading Jars ...
echo ============================
(
cat batchenv.ini
cat basenv.ini
//g;/^$/d;' |^#" | sed 's/^[ ]*//g;s/[ ]*//g;s/
awk 'BEGIN{classpath="."}{
if (NF == 0) next
if (classpath != "") classpath=classpath":"$1
else classpath=$1
}END{print classpath}' | read CLASSPATH _x
export CLASSPATH
if [ -z "${JAVA_OPTS}" ]; then
JAVA_OPTS="-Xms256m -Xmx1024m -XX:MaxPermSize=256M"
fi
export JAVA_OPTS
echo ============================
echo Start Batch Service
echo ============================
#echo java ${JAVA_OPTS} -classpath ${CLASSPATH} com.afcat.cbs.is.batch.launch.BatchLauncher
(
echo ${CLASSPATH}
echo ${JAVA_OPTS}
java ${JAVA_OPTS} ${JAVA_DUMPOPTS} com.afcat.cbs.is.batch.launch.BatchLauncher 2>&1
) | tee log/${APPID}_${STAMP}.log &
可是为什么重启就又能加载到那个Class了呢?后来在一篇博客中看到这样的内容:
直接运行export命令定义变量【只对当前shell(BASH)有效(临时的)】 在shell的命令行下直接使用[export
变量名=变量值] 定义变量,该变量只在当前的shell(BASH)或其子shell(BASH)下是有效的,
shell关闭了,变量也就失效了,再打开新shell时就没有这个变量,需要使用的话还需要重新定义。
回过来一看我的启动脚本中果然直接export了环境变量,并且还不是声明在.bachrc文件中的,按照上面的说法,不再使用临时的环境变量,转而直接将所有的jar打包在一起,用Java -jar启动,果然奏效了,再也没有出现过“NoClassFounder”的问题!下面是修改后的batch脚本。
#!/bin/ksh
APPID=`basename $0 .sh`
STAMP=`date +%Y%m%d%H%M%S`
echo ============================
echo Loading Jars ...
echo ============================
if [ -z "${JAVA_OPTS}" ]; then
JAVA_OPTS="-Xms256m -Xmx1024m -XX:MaxPermSize=256M"
fi
export JAVA_OPTS
JAVA_OPTS="${JAVA_OPTS} -Dlogback.FilePath=$HOME/ccbs-lib -DCBS_PRO=$HOME/properties"
echo ============================
echo Start Batch Service
echo ============================
#echo java ${JAVA_OPTS} -classpath ${CLASSPATH} com.afcat.cbs.is.batch.launch.BatchLauncher
(
echo ${CLASSPATH}
echo ${JAVA_OPTS}
#java ${JAVA_OPTS} ${JAVA_DUMPOPTS} com.afcat.cbs.is.batch.launch.BatchLauncher 2>&1
#) | tee log/${APPID}_${STAMP}.log &
#nohup java ${JAVA_OPTS} com.afcat.cbs.is.batch.launch.BatchLauncher >log/${APPID}_${STAMP}.log 2>&1 &
#tail -f log/${APPID}_${STAMP}.log
nohup java ${JAVA_OPTS} -jar lib/com.afcat.cbs.is.batch.jar >log/${APPID}_${STAMP}.log &
)
总结一下“NoClassFounder”时不时出现情况的原因:当batch脚本启动后,如果之后再次启动其他的两个脚本,batch脚本的临时变量便会失效,CLASSPATH所加载的jar包也便会全部失效,就会出现上面的异常,但如果重启batch脚本,就会恢复正常,这是因为重新加载了CLASSPATH变量,jar也同时加载生效。