2012-11-29 56 views
3

我不知道如何构建我的耳朵文件在我的上下文中。我可以在哪里放我的罐子?耳朵与Jboss 5.1

这里是我的实际结构:

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

在耳/ lib中,我有两次世界大战之间的所有常见的罐子。一切正常,但我的耳朵很重。

事实上,war1和war2共用一些罐子。 WarA和warB也是。

我不把这些罐子放在耳朵里,因为warA/B不会使用任何东西,也不会使用war1/2。

今天,1/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会更轻。战争和战争B是同样的事情。

你知道我是否可以做到这一点,我可以用什么样的档案做到这一点?罐子,战争,萨尔?我在JBoss 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

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

可能的解决方案: 您可以为每个集合添加一个新的战争,这些战争将包含同一集合中其余战争共享的库。然后,为了使它在没有类加载问题的情况下工作,应该通过在每个战争的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> 

要点:该域属性对于同一组中的所有战争而言必须相同。

最后的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> 

另一种可能的解决方案,与此类似,将被放置每个组的共享库在一个这样你就不需要为图书馆开战了。

+0

我已经用这个jboss-classloading.xml隔离了我的战争,它工作的很好。我认为我没有背景就没有战争。我想我会使用这个解决方案。感谢您的帮助:) – Kiva

+0

不客气,项目好运! – Toni

+0

@ ToniS.Magraner是否有任何性能问题,如果我们将所有罐子与战争分开加载(通过将所有罐子单独放置在战争中) –

0

如果我的理解是正确的,你不必库版本,并隔离任何问题,所以如果单独一个库用于所有的战争不是归档的,你可以把它们全部放在耳朵的lib目录中(你甚至可以考虑将这些库放在jboss实例lib目录中,并将它们从耳朵/战争中移除!)。这样耳朵文件将有可能的最小尺寸。

不要担心使用的内存,JBoss类加载器只会加载一次库,所以它们将被所有需要它们的战争共享(另一种情况是,如果您需要不同版本的相同库每场战争)。另一方面,如果任何一个库只被其中一个war文件使用,如果将该库放置在这个war的lib目录中,它也是最优的。

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

+0

感谢你的答案。我不能将jar放在server/lib中,因为生产团队不想管理它。我在这个团队中提供了耳朵,我没有在机器上的手。我知道Jboss只装载一次图书馆。我只是想减少耳朵的大小,并知道是否有可能做到我的想法。我的第一种方法工作正常,但是两次使用同一个罐子并不“理想”。 – Kiva

+0

然后我还没有明白你的第一个方法。使用第一种方法,您只需将罐放在一个位置:耳朵的lib目录(因此您不需要将其放入战争中,以便将它们从这里移除)。 – Toni

+0

好吧,我想我错过了。在耳边/胸部,我有用于全部战争的普通罐子(1/2/A/B)。但是战争1/2分享了一些不兼容的战争/ B分享罐子的罐子。 war1/2在一个classloader中被隔离在一起,这个classloader有父域名。 warA/B也与父域的ear域一起被隔离。所有东西都是这样的,没关系,但是我希望另一个档案(不是在ear/lib中,因为它在每次战争之间并不常见)包含war1/2的常见jar(所以我可以从war1/2中删除这些jar)。我希望它更清晰:) – Kiva

相关问题