2010-01-21 81 views
12

我是新來的Jboss,但我有多個Web應用程序,每個都使用spring-hibernate和其他開源庫和portlet,所以現在基本上每個war文件都包含這些jar文件。如何將這些罐子移動到一個共同的位置,以便我不必將這些罐子放在每個戰爭檔案中?我想位置是server/default/lib,但我不確定。在JBoss AS 5中放置共享庫的位置?

另外,如何讓這些罐子在WEB-INF/libJBOSS/server/default/lib之間有什麼不同呢?我會面臨任何類加載器問題嗎?

此外,我有靜態數據存儲在像Singleton這樣的靜態字段中,這些文件是否可以在所有WAR文件之間共享?

回答

18

類加載:

你說得對,把.jar s到JBOSS/server/<configuration>/lib,或JBOSS/lib

JBoss AS附帶捆綁的Hibernate庫,它們使用該版本進行測試。

jboss-6.0.0-SNAPSHOT\server\default\conf\jboss-service.xml

<server> 
    <!-- Load all jars from the JBOSS_HOME/server/<config>/lib directory and 
     the shared JBOSS_HOME/common/lib directory. This can be restricted to 
     specific jars by specifying them in the archives attribute. 
     TODO: Move this configuration elsewhere 
    --> 
    <classpath codebase="${jboss.server.lib.url}" archives="*"/> 
    <classpath codebase="${jboss.common.lib.url}" archives="*"/> 
</server> 

另見:

差異WEB-INF/lib和之間:

WEB/lib中的庫隨WAR一起提供,僅在WAR中可見。 如果您有其他模塊,例如EJB JAR,它們將不可見,您將獲得ClassNotFoundException或(如果您在多個位置有班級)ClassCastException

JBOSS-AS/server/<config>/lib中的庫對整個服務器都是可見的,因此所有已部署的應用程序及其模塊都可見。但是(IIRC)它們沒有優先權,所以如果你帶上這個庫,例如在WAR中,但不在EJB jar中,最終可能會使用兩個不同的版本,這是不受歡迎的(可能會導致上述ClassCastException)。

類加載行爲可以調整幾種方式,請參閱JBoss wiki

靜態數據:

不要依賴於Java EE中,帶來的麻煩靜態字段。例如,。同一個類可以被不同的類加載器加載,所以這些靜態值會有多個實例。
如果您想在更多的WAR之間共享數據,請使用外部存儲 - 數據庫,文件(如果您要寫入同步文件),JBoss Cache等。

+1

+1我更喜歡我自己的共享JAR的一個自己專用的目錄這使得它更容易維護 – stacker 2010-01-21 12:35:03

0

JBOSS/server/default/lib工作正常。

該文件夾中的所有jar將被加載到JBoss中。

0
  1. 轉到%JBOSS_HOME%\服務器\ DEFAULT \ conf目錄
  2. 打開文件的jboss-service.xml的
  3. 在標籤,你會發現

添加ne w ^下面的classpath標籤,包括本地計算機

注意的sharedlib文件夾:請確保包含的文件協議的代碼庫