3

我不知道如何在我的上下文中构建我的耳朵文件。

这是我的实际结构:

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

在 ear/lib 中,我在战争之间有所有常见的罐子。一切正常,但我的耳朵很重。

事实上,war1 和 war2 共享一些 jar。WarA 和 WarB 也是。

我没有将这些罐子放在 ear/lib 中,因为 warA/B 不使用所有东西,war1/2 也一样。

今天,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 会更轻。战争A和战争B也是一​​样。

你知道我能不能做到这一点,我可以用什么样的档案来做到这一点?罐子,战争,sar?我在 Jboss 5.1

谢谢

4

2 回答 2

2

所以问题是:你有两套战争的耳朵:每一套使用同一个库的不同版本(所以第一套使用的版本必须与第二套隔离,反之亦然),而你没有不想在耳朵的不同位置多次放置同一个库。这些库的一部分,您可能拥有所有模块共享的其他库。

可能的解决方案:您可以为每个集合添加一个新的战争,这些将只包含同一集合中其余战争共享的库。然后,为了让它在没有类加载问题的情况下工作,你应该通过在每个 wars WEB-INF 目录和耳朵的 META-INF/jboss-classloading.xml 中方便地配置一个 jboss-classloading.xml 来隔离每组保持战争。

所以结构会是这样的:

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

名为 libsSet* 的战争仅用于保留同一集合的战争使用的库。

集合 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>

重要提示:同一集中的所有战争的域属性必须相同。

最后,ear 文件中的 META-INF/jboss-classloading.xml 应该是:

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

与此类似的另一种可能的解决方案是将每个集合的共享库置于该集合的战争之一中,这样您就不需要仅仅为库而战。

于 2012-12-03T16:31:03.220 回答
0

如果我理解正确,您没有任何库版本和隔离问题,因此无论是否所有战争档案都使用库,您都可以将它们全部放在耳朵的 lib 目录中(您甚至可以考虑将库放在 jboss 实例 lib 目录中,并将它们从 ear/wars 中删除!)。这样,ear 文件将具有尽可能小的尺寸。

不用担心使用的内存,JBoss 类加载器只会加载一次库,因此它们将被所有需要它们的战争共享(另一种情况是,如果您需要为每个战争使用同一个库的不同版本) .

另一方面,如果任何一个库只被一个war文件使用,那么将库放在这个war的lib目录中也是最佳选择。

所以你的第一种方法是正确的,我认为你不需要改变它。

于 2012-11-29T23:29:00.990 回答