tomcat 6 에서 동작하던 웹 어플리케이션을 tomcat 7 (7.0.25) 으로 올려보았다.  tomcat 7이 servlet 3.0의 comet을 지원하는 것외에 특별히 고쳤을까 싶었는데..

tomcat6의 catalina.sh를 그대로 사용할 때와 tag library쪽에 이슈가 있었다.

 

## catalina.sh start 되게

설정 파일 conf/server.xml과 bin/catalina.sh 는 tomcat 6에 있는 것으로 사용하려고 하다가 다음과 같은 에러를 만났다. (역시 tomcat 7의 catalina.sh을 사용하는 것이 맞을 듯.)

java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory

 

tomcat7의 catalina.sh 에 classpath에 bin/tomcat-juli.jar 부분이 변경된 것 같다.

# Add tomcat-juli.jar to classpath
# tomcat-juli.jar can be over-ridden per instance
if [ -r "$CATALINA_BASE/bin/tomcat-juli.jar" ] ; then
  CLASSPATH=$CLASSPATH:$CATALINA_BASE/bin/tomcat-juli.jar
else
  CLASSPATH=$CLASSPATH:$CATALINA_HOME/bin/tomcat-juli.jar
fi

 

또한 입맛에 좀 맞게 catalina.sh를 변경해야 한다.  (CATALINA_JAVAOPTS, $CATALINA_LOGDIR, CATALINA_LOGFILE, CATALINA_HOME)

conf/server.xml은 그대로 수정해서 사용하니 잘 동작된다.

 

## catalina.sh  stop되게

stop 시에 대한 설정을 일부 수정해야 한다.

stop을 하면, sleep 5초를 한다. (디폴트) kill 하고, 안죽으면 force하게 죽는 작업이 되어 있다.

이 부분을 입맛에 맞게 변경

 

## catalina.sh configtest

아파치의 문법 체크(httpd -t )처럼 설정 문법을 테스트하는게 생겼다.

 

소스는 다음과 같다.

elif [ "$1" = "configtest" ] ; then
   
    eval \"$_RUNJAVA\" $JAVA_OPTS \
      -Djava.endorsed.dirs=\"$JAVA_ENDORSED_DIRS\" -classpath \"$CLASSPATH\" \
      -Dcatalina.base=\"$CATALINA_BASE\" \
      -Dcatalina.home=\"$CATALINA_HOME\" \
      -Djava.io.tmpdir=\"$CATALINA_TMPDIR\" \
      org.apache.catalina.startup.Bootstrap configtest
    result=$?
    if [ $result -ne 0 ]; then
        echo "Configuration error detected!"
    fi   
    exit $result
fi

 

 

## Tomcat 이슈

tomcat6에서 잘 동작하는 소스를 tomcat 7에서 돌릴 때는 어떠할까. 태그 라이브러리쪽에 이슈가 있었다.

org.apache.jasper.JasperException: The absolute uri: http://taglib.google.com/hiu cannot be resolved in either web.xml or the jar files deployed with this application

at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:56)
at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:410)
at org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:117)
at org.apache.jasper.compiler.TagLibraryInfoImpl.generateTLDLocation(TagLibraryInfoImpl.java:311)
at org.apache.jasper.compiler.TagLibraryInfoImpl.<init>(TagLibraryInfoImpl.java:152)
at org.apache.jasper.compiler.Parser.parseTaglibDirective(Parser.java:410)
at org.apache.jasper.compiler.Parser.parseDirective(Parser.java:475)
at org.apache.jasper.compiler.Parser.parseElements(Parser.java:1427)
at org.apache.jasper.compiler.Parser.parse(Parser.java:138)
at org.apache.jasper.compiler.ParserController.doParse(ParserController.java:242)
at org.apache.jasper.compiler.ParserController.parse(ParserController.java:102)
at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:198)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:373)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:353)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:340)
at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:646)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:357)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)

 

tomcat 6에서는 기존에 tag library 파일들을 META-INF 디렉토리안에 넣으면 자동으로 인식하는 기능이 있었는데, 이 부분이 tomcat 7부터는 web.xml에 명시적으로 관련 정보를 넣는 구조로 바뀌었다.

 

즉 기존의 파일은 다음과 같이 사용했다.


src/main/java/META-INF/taglib/hiu-taglib.tld

<?xml version="1.0" encoding="UTF-8"?>

<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    version="2.0">

    <description>HIU Custom Tags</description>
    <tlib-version>1.2</tlib-version>
    <short-name>hiu</short-name>
    <uri>http://taglib.google.com/hiu</uri>


<tag>

….

</tag>

…..

 

web.xml에 taglibarary에 대한 url와 location에 대해서 명확히 지정해야 한다.

(tld 파일을 META-INF가 아닌 WEB-INF 로 이동해야 잘 인식해서 WEB-INF 로 이동하니 잘된다.
/META-INF/taglib.tld 파일로 수정해도 인식 못한다. )

* web.xml에 추가할 내용

<jsp-config>
    <taglib>
        <taglib-uri>http://taglib.google.com/hiu</taglib-uri>
        <taglib-location>/WEB-INF/hiu-taglib.tld</taglib-location>
    </taglib>
</jsp-config>

WEB-INF 디렉토리 밑에 tag lib를 두면 자동으로 인식하기 때문에 꼭 저렇게 사용하지는 않아도 된다.

정확한 지식을 위해서 jsp 2.2 스펙을 참조한다.

 

 

* Java Server Page 2.2 specification (tomcat 7이 적용, jsp 2.2) 
http://jcp.org/aboutJava/communityprocess/mrel/jsr245/index.html

스펙을 참조하니. 이해가 되었다. 역시 스펙의 힘이란…

 

예제가 설명이 되어 있다.

 

순서에 대한 정보도 있다.

자세한 내용은 아래를 참조하면 된다.

JSP.7.3.2 TLD resource path
JSP.7.3.3 Taglib Map in web.xml
JSP.7.3.4 Implicit Map Entries from TLDs
JSP.7.3.5 Implicit Map Entries from the Container
JSP.7.3.6 Determining the TLD Resource Path

Posted by '김용환'
,