# 목적

-. JDK자체에 포함된 것이 아닌 설치한 라이브러리의 것을 로딩하려 할 때 사용

 

# 기본정리

-. JAXP 라이브러리 : jaxp-api.jar, jaxp-ri.jar

-. 각 JDK 버전마다 JAXP 라이브러리가 포함되어 있음. 그러나 각각 JAXP버전은 상이함.

     JDK 1.4 : JAXP 1.2

     JDK 5 : JAXP 1.3

     JDK 6 : JAXP 1.4

 

   * JDK버전에 -0.2를 하면 된다고 생각하면 될듯.  

 

 

# 문제가 발생하는 경우

JDK 1.4로 개발하면서 JAXP 1.3을 쓰려고 하면 동일한 패키지명을 가지는 클래스가 2개가 존재하게 된다.

즉, org.w3c.dom.Document 의 경우 JAXP1.2는 rt.jar에 존재하고 JAXP1.3은 jaxp-api.jar에 존재함

jaxp-api.jar에 있는 클래스를 로딩하려 하나 그렇게 동작하지 않음.

설치한 라이브러리들의 간의 로딩 순서는 classpath로 조절가능하지만 rt.jar는 설정 순서로 조절할 수 없음.

 

 

# 사용법

JVM 옵션에 "java.endorsed.dirs" 시스템 파라미터 설정

 

ex) /home/tmax/endorsed 라는 디렉토리에 jaxp-api.jar 넣었을 경우

java -Djava.endorsed.dirs=/home/tmax/endorsed

 

 

 

# 기타

-. ClassLoading매커니즘에서 "java."로 시작하는 패키지의 클래스는 endorsed가 적용되지 않음.

-. JAXP1.4가 설치되어 있다면 apache xalan의 다음과 같은 라이브러리들을 따로 설치할 필요 없다. JAXP안에 포함되어 있기 때문이다. 설치할 필요가 없는것 보다는 쫑나는 상황을 피하기 위하여 설치해서는 안됨.

  serializer.jar

  xalan.jar

  xercesImpl.jar

  xml-apis.jar

  xsltc.jar

-. jaxp는 sun의 glassfish 프로젝트에서 관리하고 있음.

 

 

# JEUS관련

1) JAXP라이브러리 위치

  -. JEUS5 : lib/system 안에 위치

  -. JEUS6 : lib/endorsed 안에 위치 (JEUS6으로 가면서 endorsed디렉토리 별개 분리함)

 

2) 버전별 동작 방식

  ㄱ) JEUS 6

     -. 아래와 같이  JEUS6의 jeus 스크립트에 기본적으로 ${JEUS_HOME}/lib/endorsed 로 설정되어

       JEUS에 포함된 JAXP 라이브러리를 사용하게 됨.

     -. jeus 스크립트 예)

========================================================

...중략...

# execute jeus with echo

set -x

"${JAVA_HOME}/bin/java" $VM_OPTION  $SESSION_MEM                            \

    -Xbootclasspath/p:"${JEUS_HOME}/lib/system/extension.jar"               \

    -classpath "${JEUS_HOME}/lib/system/bootstrap.jar"                      \

    -Dsun.rmi.dgc.client.gcInterval=3600000                                 \

    -Dsun.rmi.dgc.server.gcInterval=3600000                                 \

    -Djava.library.path="${JEUS_LIBPATH}"                                   \

    -Djava.endorsed.dirs="${JEUS_HOME}/lib/endorsed"                        \

...중략...

 

  ㄴ) JEUS 5

      -. JEUS 6과는 달리 jeus스크립트에 존재하지 않음

      -. 따라서 JDK에 포함되어 있다면 JDK에 존재하는 JAXP 라이브러리가 로딩되고

      -. JDK에 포함되어 있지 않으면 $JEUS_HOME/lib/system 에 있는 JAXP 라이브러리가 로딩된다.

      -. 따라서 특정버전의 JAXP를 사용하려 한다면 JEUS6과 같이

         -Djava.endorsed.dirs="${JEUS_HOME}/lib/endorsed"  설정을 해야 함.