티스토리 뷰
본 포스팅은 JEUS6 XML 사용 가이드입니다.
XML Library 사용 시 발생하는 에러들과 해결 방법에 대한 가이드
. 유형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.DocumentBuilderFactory는 root 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 으로 변경해서 해결
$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에 존재함)
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 라이브러리를 사용하도록 통일합니다.
고맙습니다.
'④ 미들웨어 > ⓙ 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 |
- Total
- Today
- Yesterday
- JBoss
- git
- SWA
- JEUS7
- 아키텍처
- wildfly
- k8s
- Da
- 마이크로서비스 아키텍처
- webtob
- 마이크로서비스
- API Gateway
- openstack token issue
- Architecture
- JEUS6
- aws
- TA
- openstack tenant
- SA
- nodejs
- 오픈스택
- jeus
- node.js
- 쿠버네티스
- apache
- kubernetes
- Docker
- aa
- OpenStack
- MSA
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |