Java에는 XML 파서가 내장되어 있다.
Crimson 파서가 그녀석인데, 성능이 별로 안좋은지, 대부분 다른 것을 사용한다.
그렇다면 다른 파서로 변경은 어떻게 해야할까?
WAS나 AXIS 같은 애들은 알아서 셋팅을 해주는 것 처럼 보인다.
대체 어떻게 해먹는지 몰라서 ${JAVA_HOME}/jre/lib/endorsed 에 다른 파서를 강제로 넣어주었다.
그런데 나는 이런방법을 무지 싫어한다.
고로 다른 방법을 찾던중 오늘 실마리를 잡아 해결였다.
우선은 Manifest 라는 녀석에 대해서 알고 있어야한다.
잘 알 필요는 없고, 이 녀석에 의해서 기본 파서를 변경할 수 있고, 그 방법만 알면 된다.
보통 jar 로 패키징한 녀석을 풀어보면 META-INF 라는 디렉토리가 생긴다.
여기에 들어가는 정보들로 해당 jar의 기본 파서를 변경할 수 있다.
Manifest의 Service Provider라는 개념으로 파서를 수정하는 것으로
XML 파서의 인터페이스를 다른 파서의 구현체로 셋팅을 해주는 것이다.
나는 Xerces를 사용하기 위해서
META-INF/services/javax.xml.parsers.DocumentBuilderFactory 파일을 만들고
그 내용으로
org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
를 설정했다.
그리고 jar 패키징을 하였다.
이런 구조에 대해서는 여기 서 알아 볼 수 있지만,
잘 몰라서 그런지는 몰라도 MANIFEST.MF를 수정하는 것이 아니라.
패키징을 할때 클래스 디렉토리 그리고 META-INF 디렉토리를 함께 묶어야 패키지에 삽입이 되었다.
안타깝게도 그냥 jar cvf my.jar myclassdir META-INF 명령으로 묶으면 jar 커맨드에서 무시해버린다.
그것을 피하기 위해서 별 내용없은 MANIFEST.MF 를 만들어 cvmf 로 이 파일과 함께 묶었더니 성공했다.
이제는 변경된 XML 파서의 클래스패스만 잡아주면 알아서 원하는 파서로 작동이 된다.
Crimson 파서가 그녀석인데, 성능이 별로 안좋은지, 대부분 다른 것을 사용한다.
그렇다면 다른 파서로 변경은 어떻게 해야할까?
WAS나 AXIS 같은 애들은 알아서 셋팅을 해주는 것 처럼 보인다.
대체 어떻게 해먹는지 몰라서 ${JAVA_HOME}/jre/lib/endorsed 에 다른 파서를 강제로 넣어주었다.
그런데 나는 이런방법을 무지 싫어한다.
고로 다른 방법을 찾던중 오늘 실마리를 잡아 해결였다.
우선은 Manifest 라는 녀석에 대해서 알고 있어야한다.
잘 알 필요는 없고, 이 녀석에 의해서 기본 파서를 변경할 수 있고, 그 방법만 알면 된다.
보통 jar 로 패키징한 녀석을 풀어보면 META-INF 라는 디렉토리가 생긴다.
여기에 들어가는 정보들로 해당 jar의 기본 파서를 변경할 수 있다.
Manifest의 Service Provider라는 개념으로 파서를 수정하는 것으로
XML 파서의 인터페이스를 다른 파서의 구현체로 셋팅을 해주는 것이다.
나는 Xerces를 사용하기 위해서
META-INF/services/javax.xml.parsers.DocumentBuilderFactory 파일을 만들고
그 내용으로
org.apache.xerces.jaxp.DocumentBuilderFactoryImpl
를 설정했다.
그리고 jar 패키징을 하였다.
이런 구조에 대해서는 여기 서 알아 볼 수 있지만,
잘 몰라서 그런지는 몰라도 MANIFEST.MF를 수정하는 것이 아니라.
패키징을 할때 클래스 디렉토리 그리고 META-INF 디렉토리를 함께 묶어야 패키지에 삽입이 되었다.
안타깝게도 그냥 jar cvf my.jar myclassdir META-INF 명령으로 묶으면 jar 커맨드에서 무시해버린다.
그것을 피하기 위해서 별 내용없은 MANIFEST.MF 를 만들어 cvmf 로 이 파일과 함께 묶었더니 성공했다.
이제는 변경된 XML 파서의 클래스패스만 잡아주면 알아서 원하는 파서로 작동이 된다.