로그인 상태가 아닙니다.
# 목적
-. 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" 설정을 해야 함.