JEUS Class Loader
JEUS의 Class Loader에는 JEUS 만의 특징을 가지고 있다. 크게 두 가지 방식이 존재 합니다. 기존 버전의 Jar class loading mode에 해당하는 Shared classloader 와 JEUS 5부터 추가된 Isloated classloader가 있습니다. 하지만 기존에 사용하는 DIR mode에 해당하는 classloader 구조는 제거 되었습니다. 하지만 DIR에서의 장점 이었던 디렉토리의 class file을 이용한 deploy는 JEUS5 에서도 가능합니다.
Shared classloader
[그림] Sharded ClassLoader
1.Root Class Loader 에서는 JEUS Manager 레벨이며 이 class loader는 시스템 라이브러리와 JDBC 드라이버, user class path를 로딩할 때 사용됩니다.
2.Servlet(Web) Class Loader는 웹 어플리케이션에서 사용되는 클래스를 로드 할 때 사용됩니다.
3.JSP(Web context) Class Loader는 Web Context에 해당되는 Servlet 클래스를 로딩합니다.
4.EJB Root Class Loader는 EJB Engine 자체에서 필요한 클래스와 EJB 클래스를 로딩합니다.
5.EJB Jar Class Loader는 특정 EJB 모듈 클래스와 라이브러리를 로딩합니다.
위 구조의 Shared classloader에서는 Web classloader에서 EJB classloader로 class를 요청 하거나 EJB classloader중 하나가 class를 요청 할 때에는 모든 EJB classloader에게 class를 요청 합니다. 이렇게 하나의 application이 다른 application의 classloader를 공유하기 때문에 shared classloader라고 합니다.
이렇게 함으로써 4.x대의 JEUS에서는 EJB를 사용하는 application이 그 EJB의interface나 class들이 없어도 그 EJB의 classloader를 공유함으로써 필요한 class들을 읽어 올 수 있습니다.
하지만 이런 점 때문에 한 application의 class가 다른 application의 class와 linking이 이루어지므로 redeploy를 할 경우에는 연관되어 있는 application들을 모두 undeploy 한 후 deploy해야 하는 문제가 발생하고 class들을 공유함으로써 여러 가지 문제가 발생 할 수도 있습니다.
Isolated classloader
[그림] Isolated Class Loader
이 구조에서는 각 application 마다 application 내의 web module의 classloader가 그 application의 EJB classloader의 하위에 존재하고 한 application의 classloader는 다른 application의 classloader에게 class를 요청하지 않습니다.
J2EE 1.4 spec은 한 application이 자신이 사용하는 다른 application의 interface class들을 같이 packaging하도록 규정하고 있고 이를 따른다면 다른 application의 classloader에게 interface class를 요청하지 않아도 자신의 classloader에서 이 class들을 읽을 수 있으므로 ClassNotFoundException이 발생하지 않게 됩니다.
다만 class를 공유할 수 없으므로 다른 EJB application의 local interface는 사용할 수 없게 됩니다. 이 경우에는 remote interface만 사용 가능합니다. Class를 공유하지 않기 때문에 class 공유로 생길 수 있는 문제가 존재하지 않고 한 application을 redeploy할 때 다른 application을 undeploy할 필요가 없어집니다.
이 classloader 구조를 제대로 사용하기 위해서는 연관된 application끼리 EAR로 묶어 하나의 application으로 만드는 작업이 필요합니다. 하나의 application은 하나의 classloader delegation 구조를 가지기 때문에 서로 class공유가 가능하므로 같은 EAR 내의 EJB에 대해서는 local interface 사용이 가능합니다.