[JAVA] sealing violation

JAVA 2014. 4. 17. 20:25

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를 적절하게 사용한다.

끝.



Posted by 마법수정화살
,