2012-11-29 4 views
3

내 귀에 파일을 내 상황에 맞게 구성하는 방법을 모르겠습니다. 귀/lib에내 항아리는 어디에 둘 수 있습니까? Ear with Jboss 5.1

ear 
--lib 
--war1 
--war2 
--warA 
--warB 

, 나는 전쟁 사이의 모든 일반적인 병이 있습니다

여기 내 실제 구조입니다. 모든 것이 잘 작동하지만 귀는 무겁습니다.

실제로 war1과 war2는 몇 개의 병을 공유합니다. WarA와 warB도.

warA/B가 모든 것을 사용하고 war1/2도 사용하지 않기 때문에이 jar를 귀/lib에 넣지 않습니다.

오늘 war1/2는 모든 항아리와 함께 제공되기 때문에 일부 항아리는 두 개가됩니다.

나는 이런 식으로 뭔가를하고 싶은 : 이것처럼

ear 
--lib (common jars) 
--war1 
--war2 
--something who comes with common jars for war1/2 
--warA 
--warB 
--something who comes with common jars for warA/B 

을 war1 및 war2 가볍고 될 것입니다. 전쟁과 전쟁에 대해서도 마찬가지입니다.

제가 그 일을 할 수 있는지, 그리고 제가 할 수있는 일종의 아카이브가 있습니까? 항아리, 전쟁? 나는 그것이 올바르게 라이브러리 버전과 분리의 문제가없는 이해했다면 나는, 제이 보스 5.1

감사

+0

4 개의 모든 전쟁이 귀에있는 모든 수업을 보는 것이 중요합니까? 즉, 자신의 도메인에서 격리되고 부모 도메인에서 추가 클래스를 찾으려면 WAR가 필요합니까? – CoolBeans

+0

오늘날 war1/2는 warA/B와 분리되어 있으며 공통된 부모 도메인 (귀 도메인)입니다. – Kiva

+0

참고로 Jboss에 관한이 흥미로운 문제에 관한 블로그 (프랑스어)에 기사를 작성했습니다. classLoader => http://blog-dev.net/technique/serveurs/bug-classcastexception-et-classloader-jboss/001758 – Kiva

답변

2

문제는 다음과 같습니다. 두 세트의 전쟁이있는 귀가 있습니다. 각 세트는 동일한 라이브러리의 다른 버전을 사용합니다 (첫 번째 세트에서 사용 된 버전이 두 번째 세트에서 분리되어야하고 viceversa). 그리고 귀의 다른 장소에 여러 번 같은 라이브러리를두기를 원하지는 않을 것입니다. 이 라이브러리의 일부로, 모든 모듈이 공유하는 다른 라이브러리가있을 수 있습니다.

가능한 해결 방법 : 각 세트에 새로운 전쟁을 추가 할 수 있습니다.이 세트에는 전쟁의 나머지 세트가 공유하는 라이브러리 만 포함됩니다. 그런 다음 클래스로드 문제없이 작동하게하려면 각 WAR WEB-INF 디렉토리 및 ear의 META-INF/jboss-classloading.xml에 편리하게 구성된 jboss-classloading.xml을 배치하여 각 세트를 격리해야합니다. 전쟁을 지킨다. libsSet *라는 이름의

yourapp.ear 
    | 
    |--lib 
    | |- place here the libraries shared by all the wars in the ear 
    | 
    |--META-INF 
    |  | 
    |  |-jboss-classloading.xml 
    | 
    |--war1SetA.war 
    |  | 
    |  |-WEB-INF 
    |   |- jboss-classloading.xml  
    |   | 
    |   |- classes 
    |  
    |  
    |--war2SetA.war 
    |  | 
    |  |-WEB-INF 
    |   |- jboss-classloading.xml  
    |   | 
    |   |- classes 
    |  
    |  
    |--libsSetA.war 
    |  | 
    |  |-WEB-INF 
    |   |- jboss-classloading.xml  
    |   | 
    |   |- lib 
    |    |-Place here the libraries used by wars of setA 
    |  
    |--war1SetB.war 
    |  | 
    |  |-WEB-INF 
    |   |- jboss-classloading.xml  
    |   | 
    |   |- classes 
    |  
    |--war2SetB.war 
    |  | 
    |  |-WEB-INF 
    |   |- jboss-classloading.xml  
    |   | 
    |   |- classes 
    |  
    |--libsSetB.war 
      | 
      |-WEB-INF 
       |- jboss-classloading.xml  
       | 
       |- lib 
        |-Place here the libraries used by wars of setB 

전쟁은 동일한 세트의 전쟁에서 사용하는 라이브러리를 유지하기 위해 바로 사용됩니다

그래서 구조는 다음과 같을 것이다.

세트 A의 전쟁은 JBoss-classloading.xml이 유사해야

<classloading xmlns="urn:jboss:classloading:1.0" 
    domain="SetA" 
    export-all="NON_EMPTY" 
    import-all="true" 
    parent-domain="yourapp.ear" 
    parent-first="false"> 
</classloading> 

및 세트 B의 워 그것은 같아야 중요

<classloading xmlns="urn:jboss:classloading:1.0" 
    domain="SetB" 
    export-all="NON_EMPTY" 
    import-all="true" 
    parent-domain="yourapp.ear" 
    parent-first="false"> 
</classloading> 

: 도메인 속성은 동일한 세트의 모든 전쟁에 대해 동일해야합니다.

그리고

마침내 귀 파일의 META-INF/제이 보스 - classloading.xml은 다음과 같아야합니다, 이것과 같은

<classloading xmlns="urn:jboss:classloading:1.0" 
    domain="yourapp.ear" 
    export-all="NON_EMPTY" 
    import-all="true" 
    parent-first="false"> 
</classloading> 

또 다른 가능한 솔루션, 하나의 각 세트의 공유 라이브러리를 배치 할 것 세트의 전쟁 중, 당신은 도서관을 위해서만 전쟁을 필요로하지 않을 것입니다.

+0

나는이 jboss-classloading.xml로 이미 전쟁을 고립 시켰으므로 괜찮습니다. 나는 컨텍스트없이 전쟁을 할 수 있다고 생각하지 않았습니다. 나는이 솔루션을 사용할 것이라고 생각한다. 도와 주셔서 감사합니다 :) – Kiva

+0

프로젝트와 함께 행운을 빈다. – Toni

+0

@ ToniS.Magraner는 모든 병을 전쟁과 별도로로드하는 경우 성능상의 문제가 있습니까? (모든 병을 전쟁에 별도로 배치하여) –

0

를 해요 그래서 독립적으로 라이브러리가 모든 전쟁 아카이브 여부에 의해 사용되는 경우의 , 귀의 lib 디렉토리 안에 모든 것을 놓을 수 있습니다 (라이브러리를 jboss 인스턴스 lib 디렉토리에 놓고 귀/전쟁에서 제거하는 것을 고려할 수도 있습니다). 이렇게하면 귀 파일의 크기가 가장 작아집니다.

사용되는 메모리에 대해 걱정하지 마십시오. JBoss 클래스 로더는 라이브러리를 한 번로드하기 때문에 필요로하는 모든 전쟁에서 공유됩니다 (동일한 라이브러리의 다른 버전이 필요하면 다른 경우가 될 것입니다). 전쟁마다).

반면에 war 파일 중 하나에서 사용 된 라이브러리가 있으면이 라이브러리의 lib 디렉토리에 라이브러리를 두는 것이 가장 좋습니다.

첫 번째 접근 방식이 옳다. 나는 당신이 그것을 바꿀 필요가 없다고 생각한다.

+0

감사합니다. 너의 답. 제작 팀이 관리를 원하지 않기 때문에 jar 파일을 server/lib에 둘 수 없습니다. 나는이 팀에서 귀를 제공하고 나는 기계에 손이 없다. 나는 Jboss가 단 한 번 librairie를로드한다는 것을 압니다. 나는 단지 귀의 크기를 줄이고 내가 생각하는 것을 할 수 있는지 알고 싶습니다. 내 첫 번째 접근 방식은 잘 작동하지만 동일한 병을 두 번 사용하는 것이 이상적인 것은 아닙니다. – Kiva

+0

그럼 첫 번째 방법을 이해하지 못했습니다. 첫 번째 접근법을 사용하면 항아리를 한 장소에 배치하면됩니다. 귀의 lib 디렉토리 (전쟁에 배치 할 필요가 없으므로 여기에서 제거 할 수 있습니다). – Toni

+0

좋아, 내가 놓친 것 같아. ear/lib에는 모든 전쟁 (1/2/A/B)에 대한 공통 항아리가 있습니다. 그러나 war 1/2는 항아리를 공유하는 warA/B와 호환되지 않는 항아리를 공유합니다. war1/2는 부모를 위해 귀 도메인을 갖는 하나의 클래스 로더에서 함께 분리됩니다. warA/B도 부모 도메인의 귀 도메인과 함께 분리됩니다. 모든 것들이 이렇게 작동합니다. 괜찮습니다.하지만 war1/2에 대한 공통 항아리가 들어 있기 때문에 귀중한 것입니다. (모든 전쟁 사이에 공통적 인 것이 아니기 때문에 귀/lib에는 없습니다.) 그래서 WAR1/2에서이 항아리를 제거 할 수 있습니다. 나는 이것 같이 더 명확하게 희망한다 : – Kiva

관련 문제