Error occurred during initialization of VM 에러 원인 해결방법(리눅스, tomcat+jdk 사용시)

리눅스서버에 WAS를 구축하기 위한 apache-tomcat을 설치할때, 가끔식 문제가 생기는 경우가 있습니다. 대부분 큰 문제없이 설치하겠지만, 종종 jdk(java)설치시 java -version 이라고 명령어를 입력하게 되면, 아래와 같은 에러메시지를 확인할 수 있죠.



# java -version

Error occurred during initialization of VM

java/lang/NoClassDefFoundError: java/lang/Object



대부분 리눅스에서는 java가 기본적으로 설치되어 있고, 기본 rpm 설치된 java를 사용하면 문제 없습니다. 다만, 별도로 오라클사이트에서 jdk를 다운받아 설치하는 사용자들 사이에서 발생되는 문제 입니다.


이와 같은 에러가 발생하게되면, 당황하지 않으시면 됩니다. 해결책은 정말 많은데, 여러사이트를 보게되면, JAVA_HOME을 해줘야된다는 내용, 그리고 PATH를 지정해줘야 된다는 내용, CALSSPATH를 설정해줘야 된다는 이야기들이 많습니다. 모두 맞는 말이지만, 위와 같은 설정을 모두 했는데도 동일한 증상이 발생한다면 다른 원인 때문 입니다.



이러한 에러 원인은 Object class 파일이 jre/lib에 있다는 것을 찾을수가 없다는 것이고, 이 녀석이 확신을 가지고 있지 않기 때문에 발생되는 것입니다.


결론적으로는 lib에 있는 jar 파일이 보이지 않는것이고, rt.pack 파일만 보이게 되는데, 이 경우에는 또 rt.jar 파일이 보이지 않게 됩니다.


이 문제를 sun 커뮤니티사이트에서도 이야기가 나왔던 내용이고, 해결방법은 pack 파일을 jar로 변환해주면 되는 것입니다.



적용방법은 아래와 같은 스크립트를 만들어서 적용하시면 됩니다.


vi path.sh


#!/bin/sh


JAVA_HOME="/usr/local/jdk1.6.0_45"  #java 경로 입니다.

JH=${JAVA_HOME:-"/usr/local/jdk1.6.0_45/jre"} #마찬가지 java 경로

UNPACK_EXE=$JH/bin/unpack200

if [ -f $UNPACK_EXE ]; then

chmod +x $UNPACK_EXE


#PACKED_JARS="/jre/lib/rt.jar /jre/lib/jsse.jar /jre/lib/charsets.jar /jre/lib/ext/localedata.jar /jre/lib/plugin.jar /jre/lib/javaws.jar /jre/lib/deploy.jar" #이부분 주석해제하시고 먼저 실행합니다.

PACKED_JARS="/lib/tools.jar" #그리고 이부분은 주석되어 있어야 됩니다. 위에꺼 실행하고, 이녀석이 실행되어야 됩니다.

for i in $PACKED_JARS; do

srcFile=${JH}`dirname $i`/`basename $i .jar`.pack

dstFile=${JH}/$i

if [ ! -f $srcFile ]; then

printf "Error: Unable to find %s. Please, check out your installation.\n" $srcFile

exit 1

fi

$UNPACK_EXE $srcFile $dstFile

if [ ! -f $dstFile ]; then

printf "Error: unpack could not create %s. Please refer to the Troubleshooting\n" $dstFile

printf "Section of the Installation Instructions on the download page.\n"

exit 1

fi


rm -f $srcFile

done


else

printf "Error: unpack command could not be found. Please refer to the \n"

printf "TroubleShooting Section of the Installation Instructions on \n"

printf "the download page.\n"

printf "Please do not attempt to install this archive file.\n"

exit 2

fi


위 스크립트를 적용하실때 주의하실 내용이 있습니다. 첫번째 PACKED_JARS를 먼저 실행하시고, 스크립트 파일을 실행한 후에 두번째 PACKED_JARS를 실행해야됩니다. 첫번째는 당연히 주석처리해야됩니다.



정말 잘 되는지 확인하는 방법은 리눅스 쉘 환경에서 java -version 이라고 간단히 입력하면 해결됩니다. 그럼 이처럼 문제없이 실행되는걸 확인할 수 있습니다.