JAR를 패킹 할때 선택적으로 sealed 여부를 정할 수 있다.
클래스들 사이에 버전 일관성을 보장한다고 하는데 맘에 안든다. 이유는 아래.
http://docs.oracle.com/javase/tutorial/deployment/jar/sealman.html
jar를 까서 manifest 파일을 보면 아래 설정 값이 있다.
Sealed: true
사용할때. 같은 A 클래스를 A.jar에서 로딩하고 다시 B.jar에서 같은 A클래스를 로딩하려고 하면
sealing violation 이 발생한다.
대표적인 것이 ojdbc 등 jdbc 드라이버 류 인데 maven-surefire 에서 수행된 후 embed was를 구동해서 테스트 하려고 하면 sealing violation 과 함께 에러 작렬
순서를 바꾸면 먼저하는 놈은 성공한다.
ANT, application, WAS 에서 쓰려고 하니 난리가 난적이 있다.
그래서 maven에서 dependency를 아예 제거한 후 Thread.currentThread().getContextClassLoader() 를 저장해 놓고 대충 아래와 같이 jdbc 드라이버를 로딩한다. 다 끝나면 저장되있던 원래 classloader로 세팅하여 깨끗하게 만든다.
URL[] urls = {
new java.io.File(OJDBC6).toURI().toURL()};
URLClassLoader urlCL = new URLClassLoader(urls, contextCL);
Thread.currentThread().setContextClassLoader(urlCL);
귀찮으면 먼저 로딩된 jar를 나중에 사용하는 것들이 사용하도록 classpath를 적절하게 사용한다.
끝.
'JAVA' 카테고리의 다른 글
톰캣의배신 : Tomcat의 jsp 백업내용 적용시 jsp 적용 안되는 현상. 롤백 안됨. (0) | 2014.10.08 |
---|---|
스레드덤프(thread dump) 분석 (0) | 2014.08.28 |
스레드덤프(thread dump) 획득방법. (0) | 2014.08.28 |
도메인이 같고 port 가 다른 JAVA 어플리케이션의 세션 충돌 (1) | 2014.05.09 |
[JUNIT] 실행순서 (0) | 2014.04.17 |