글쓴이 보관물: 낭창

Spring + Mybatis + tomcat 사용 중 “심각: Error listenerStar” 오류

아아 삽질의 연속 ㅠ.ㅜ

JDK 7, Spring 3.1, Mybatis, 3.1, tomcat 7, Ubuntu 12.04 사용 중이다.
로컬에서 Eclipse+tomcat 으로 개발 하던 어플리케이션을 서버에 배치해서 테스트 하려고 작업을 했다.
서버 설치도 다 됐고, 서버에 war 파일 올렸는데, 어플리케이션 시작이 안된다=_=
tomcat 로그에 찍히는 에러 메시지는 다음과 같이 달랑 한줄;;

2012. 6. 4 오후 11:06:18 org.apache.catalina.startup.HostConfig deployWAR
정보: Deploying web application archive /var/lib/tomcat7/webapps/app.war
2012. 6. 4 오후 11:06:20 org.apache.catalina.core.StandardContext startInternal
심각: Error listenerStart
2012. 6. 4 오후 11:06:20 org.apache.catalina.core.StandardContext startInternal
심각: Context [/app] startup failed due to previous errors
2012. 6. 4 오후 11:06:20 org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc

도저히 이유를 알 수 없는 난감한 상황인데.. 구글신께 물어보니 spring 설정이 잘 못된 경우 저 에러가
날 수 있단다. 로컬에서는 잘됐는데 설정이 이상할리가.. 라고 생각했지만…
결국 설정을 하나씩 지워가며 테스트 했는데, mybatis 쪽 설정 의심되는 상황.
정확한 오류를 알 수 없어 전전긍긍하면서, 로그도 제대로 안 찍어 주는 tomcat를 원망하다 문득 깨달았다.
spring mvc template으로 프로젝트를 생성하면 log4j 설정이 console 로 로그를 출력하도록 한다는걸=_=
그래서 즉시 파일로 출력하도록 설정을 수정했다.

<?xml version=”1.0″ encoding=”UTF-8″?>

<!DOCTYPE log4j:configuration PUBLIC “-//APACHE//DTD LOG4J 1.2//EN” “log4j.dtd”>
<log4j:configuration xmlns:log4j=”http://jakarta.apache.org/log4j/”>

        <!– Appenders –>
        <appender name=”fileLog” class=”org.apache.log4j.DailyRollingFileAppender”>
                <param name=”File” value=”/var/lib/tomcat7/webapps/app/log/app.log” />
                <param name=”Append” value=”true” />
                <layout class=”org.apache.log4j.PatternLayout”>
                        <param name=”ConversionPattern” value=”%-5p: %c – %m%n” />
                </layout>
        </appender>

        <!– Application Loggers –>
        <logger name=”z.y.x”>
                <level value=”debug” />
        </logger>

        <!– 3rdparty Loggers –>
        <logger name=”org.springframework.core”>
                <level value=”debug” />
        </logger>

        <logger name=”org.springframework.beans”>
                <level value=”debug” />
        </logger>

        <logger name=”org.springframework.context”>
                <level value=”debug” />
        </logger>

        <logger name=”org.springframework.web”>
                <level value=”debug” />
        </logger>

        <!– Root Logger –>
        <root>
                <priority value=”debug” />
                <appender-ref ref=”fileLog” />
        </root>

</log4j:configuration>

엉엉.. 로그가 정말 잘 찍힌다ㅜ.ㅜ

ERROR: org.springframework.web.context.ContextLoader – Context initialization failed
org.springframework.beans.factory.CannotLoadBeanClassException: Error loading class [z.y.x.service.UserServiceImpl] for bean with name ‘userServiceImpl’ defined in file [/var/lib/tomcat7/webapps/hadpan_web/WEB-INF/classes/z/y/x/service/UserServiceImpl.class]: problem with class file or dependent class; nested exception is java.lang.UnsupportedClassVersionError: z/y/x/service/UserServiceImpl : Unsupported major.minor version 51.0 (unable to load class z.y.x.service.UserServiceImpl)
        at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1265)

음.. 예상과 달리 직접적으로 mybatis 관련된쪽은 아닌데… Unspported major.minor version 어쩌고 하는 메시지가 보인다.
또 구글신께 물어 봤지. 자바 버전 차이에 의해 발생할 수 있는 에러란다.
아.. 어플리케이션을 자바7으로 빌드했는데, tomcat7은 JRE6 에서 돌아가고 있었던 거다.

사용 중인 Ubuntu 서버의 tomcat7 실행 스크립트를 보니 다음과 같은 부분이 있다.

  • /etc/init.d/tomcat7

JDK_DIRS=”/usr/lib/jvm/default-java ${OPENJDKS} /usr/lib/jvm/java-6-openjdk /usr/lib/jvm/java-6-sun”

# Look for the right JVM to use
for jdir in $JDK_DIRS; do
    if [ -r “$jdir/bin/java” -a -z “${JAVA_HOME}” ]; then
        JAVA_HOME=”$jdir”
    fi
done
export JAVA_HOME

/usr/lib/jvm/default-java 라는 디렉토리가 있으면 젤 먼저 거기를 JAVA_HOME으로 지정하게 되어있다.
해당 파일을 확인해 보니 역시나 버전이 6이다.

$ ls -l default-java
lrwxrwxrwx 1 root root 23  6월  4 23:10 default-java -> java-1.6.0-openjdk-i386

버전 7를 사용하도록 심볼릭 링크를 바꿔줬다.

$ rm default-java
$ ln -s java-1.7.0-openjdk-i386 default-java

그리고 tomcat 재실행.

$ service tomcat7 restart

멀쩡하게 실행이 되는 구나 ㅜ.ㅠ