2012-11-16 2 views
3

두 개의 서블릿 AServletBServlet을 가진 웹 애플리케이션 A.war가 있습니다. 둘 다 도우미 클래스 com.mycompany.Foo.class을 인스턴스화합니다 (이것은 제 3 자 라이브러리가 아닌 제 클래스입니다).2 개의 WAR에 같은 클래스가있을 때 JBoss 클래스 로딩

이제 두 개의 서블릿을 두 개의 분리 된 WAR로 분할하려고합니다. A.war에만 AServlet 만 있고 새로운 B.war에는 BServlet이 있습니다. AServlet은 HTTP GET을 통해 BServlet을 호출합니다. 두 WAR 모두 com.mycompany.Foo.class이됩니다. 동일한 JBoss 인스턴스에 두 WAR를 모두 배포하려고합니다.

문제는 동일한 클래스가 WAR와 동일한 JBoss 인스턴스에 배포되는 WAR로 인해 클래스로드 문제가 있을까요?

답변

1

아니요, 문제가 발생하지 않아야합니다. 기본적으로 웹 응용 프로그램 클래스 로더는 Java2 위임 모델과 다르게 작동합니다. 웹 응용 프로그램에 클래스가 필요한 경우 먼저 로컬 저장소 (즉, wEB-INF/classes 또는 WEB-INF/libs의 클래스 및 라이브러리를 검색합니다. 디렉토리). 따라서 제안한 구성은 문제없이 작동합니다.

두 전쟁 모두 같은 클래스를 포함하므로이 클래스를 jar 파일로 패키징하여 jboss 인스턴스의 lib 디렉토리에 배치 했습니까? 이렇게하면 인스턴스에 배포하는 모든 웹 응용 프로그램에이 메서드를 포함 할 필요가 없습니다.

Jboss documentation here을 살펴보십시오.

+0

일반적인 클래스이므로 어디서 얻었습니까? 항아리에 있어야합니까? 클래스는 공통 클래스이며 클래스/디렉토리 또는 lib/ .jar의 두 응용 프로그램에 별도로 배포 할 수 있습니다. – randominstanceOfLivingThing

+0

@Suresh Koya : 두 번째 단락에서 항아리에 있어야한다는 것을 의미하지는 않습니다. 클래스가 각 응용 프로그램의 클래스 디렉토리에 완벽하게 배치 될 수 있다고 말했기 때문에 그렇습니다. 물론 작동 할 것입니다. 하지만 대안을 지적하고 있습니다. 클래스를 JBoss $ JBOSS_HOME/server//lib 디렉토리 (jar 파일)에 배치하면 필요한 각 응용 프로그램에서 클래스를 복사 할 필요가 없습니다. – Toni

+0

답변과 docs에 대한 포인터를 보내 주신 Toni에게 감사드립니다. 또한 공통 클래스를 jar로 패키징하고 인스턴스 lib 디렉토리에 배치하는 방법을 살펴 보겠습니다. – Pacman

1

예, com.mycompany.Foo.class이 두 WAR에서 정확히 같지 않은 경우 문제가 발생합니다. 기본 JBoss 5.1에서 클래스 이름은 고유합니다 (통합 클래스 로딩). 즉, com.mycompany.Foo.class 하나만있을 수 있으며 두 응용 프로그램간에 공유됩니다. 이 동작은 비활성화 할 수 있습니다.

자세한 내용은 (JBossClassLoaderHistory) [https://community.jboss.org/wiki/JBossClassLoaderHistory]를 확인하십시오.

+0

Hi Philippe, 통합 클래스 로딩은 WAR 파일을 제외한 모든 Jboss 배포 유형에 적용됩니다. WAR의 경우 기본적으로 Jboss 5.1은 자체 WEB-INF/classes 및 WEB-INF/lib에서 직접 클래스를로드합니다. 따라서 설명하는 상황은 EAR 파일에서 발생할 것입니다. 즉, 각기 다른 EAR/lib 디렉토리에있는 동일한 라이브러리의 버전이 다르면 JBoss가 먼저 배포 할로드 할 것이므로 귀 중 하나가 자체 버전이 아닌 다른 버전을 사용하십시오. 그러나 WAR 버전에서는이 문제가 발생하지 않습니다. – Toni

+0

나는 고쳤다. –