티스토리 뷰

728x90
반응형

 포스팅은 JEUS6 XML 사용 가이드입니다.


XML Library 사용 시 발생하는 에러들과 해결 방법에 대한 가이드

 

1. 에러 유형 및 해결 방법

1.1 ClassCastException,

. 유형1 : exception is java.lang.ClassCastException: com.tmax.org.apache.xerces.jaxp.DocumentBuilderFactoryImpl incompatible with javax.xml.parsers.DocumentBuilderFactory

. 유형2 : org.apache.xerces.jaxp.DocumentBuilderFactoryImpl incompatible with javax.xml.parsers.DocumentBuilderFactory  ClassCastException

 

javax.xml.parsers.DocumentBuilderFactoryroot ClassLoader 혹은 Bootstrap classloader에 의해 loading com.tmax.org.apache.xerces.jaxp.DocumentBuilderFactoryImpl, org.apache.xerces.jaxp.DocumentBuilderFactoryImpl는  servlet ContextLoader 에서 loading library가 호환 되지 않는 버전으로 발생 한다.

. 해결 : Endorse 에 있는 library 버전으로 재 컴파일(JVM 자체에서 제공 혹은 Endorse로 제공 되는 library)

 

1.2 java.lang.IllegalArgumentException, NoSuchMethod .

. 유형1 :

----

java.lang.IllegalArgumentException: 지원되지 않습니다: indent-number

    at org.apache.xalan.processor.TransformerFactoryImpl.setAttribute(TransformerFactoryImpl.java:576)

----   

 

Apache Xalan 2.7.1 javax.xml.transform.TransformerFactory 설정은 기본값인 org.apache.xalan.processor.TransformerFactoryImpl이고,

JEUS 6.0 Fix#8 Xalan 2.7.1 javax.xml.transform.TransformerFactory 설정은 org.apache.xalan.xsltc.trax.TransformerFactoryImpl 입니다.

. 해결 :이런 류의 에러는 xml 호환 버전의 문제가 아닌 xml 안의 기능 제공 여부이므로, xml 교체 혹은 구현체만 변경 해서 해결 할 수 있다.

-Djavax.xml.transform.TransformerFactory=org.apache.xalan.processor.TransformerFactoryImpl 으로 변경해서 해결

 

2. 동작 내용 분석

2.1 xml library loading 순서

$JEUS_HOME/lib/endorsed 밑의 library -> JDK(Bootstrap classloader)-> JEUS LIB (Root classLoader) 순서 -> JEUS Servlet (Servlet ContextLoader) xml library들이 로딩

# 참고로 JEUS6 부턴 Endorsed Override Mechanism으로 JDK 5 JAXP 1.3 JAXP 1.4 overriding하여 사용합니다. 기본적으로 Apache JAXP 구현체인, xerces 2.9.1, xalan 2.7.1를 탑재함. ( $JEUS_HOME/lib/endorsed에 존재함)

 

2.2 기본 JDK JAXP 제공 내용

JDK Java EE 와 상관없이 JAXP를 내장하고 있습니다. (참고: http://en.wikipedia.org/wiki/Java_API_for_XML_Processing)

JDK 5 : JAXP 1.3 (http://docs.oracle.com/javase/1.5.0/docs/guide/xml/jaxp/ReleaseNotes_150.html)

JDK 6 : JAXP 1.4 (http://docs.oracle.com/javase/6/docs/technotes/guides/xml/jaxp/index.html)

JDK 7 : JAXP 1.4 (http://docs.oracle.com/javase/7/docs/technotes/guides/xml/jaxp/index.html)

 

2.3  JEUS 내에 ClassLoader 순서 변경



JEUS root classLoader 보다 Servlet ContextLoader이 우선 적으로 읽게 설정 방법

$APPLICATION_HOME/WEB-INF/jeus-web-dd.xml  webinf-first true로 변경.

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

<jeus-web-dd xmlns="http://www.tmaxsoft.com/xml/ns/jeus">

        <context-path>/</context-path>

        <auto-reload>

            <enable-reload>true</enable-reload>

            <check-on-demand>true</check-on-demand>

        </auto-reload>

        <webinf-first>true</webinf-first>  <!— default false -->

</jeus-web-dd>

 

XML API는 직접 번들링해서 사용하는 걸 피하시고, 가급적 JVM에 포함된 걸 사용하는 것이 중요합니다.

단순히 애플리케이션 자체적인 dependency 뿐만 아니라 JEUS 내부 엔진에서도 dependency가 있기 때문에 그렇게 하는 것이 가장 바람직합니다. XML API 관련 라이브러리들을 모두 endorsed로 등록해서 JVM, JEUS까지 같은 XML 라이브러리를 사용하도록 통일합니다.

고맙습니다.

728x90
반응형

'④ 미들웨어 > ⓙ JEUS' 카테고리의 다른 글

[JEUS7] javamelody 사용 가이드  (0) 2018.08.05
[JEUS7] 이중화 테스트 가이드  (0) 2018.08.04
[EJB] RMI 기본 구성 및 작성 가이드  (0) 2018.08.01
[JEUS7] 운영자 모니터링  (0) 2018.07.31
[JEUS6] JMX Guide  (0) 2018.07.23