2011-12-20 64 views
7

我試圖部署兩個或更多獨立的Play! (1.2.4)基礎項目到 相同的Jetty實例。玩!框架,單個Jetty實例,部署多個項目,共享庫

根據this post它顯然能夠從每個PrjName.war/WEB-INF/lib目錄提取 共同LIB的,並放置他們 到一個共享lib目錄即jetty/lib/ext

我們有大量的小型獨立項目,我們想用 來實現使用Play!但所有需要部署在同一個 Jetty實例共享所有庫以減少RAM使用量。我的假設是否正確,幾個共享相同庫的項目會減少整個內存的佔用量?

我試圖將所有庫放在一個共享位置,即jetty/lib/ext爲單個項目工作,但部署第二個項目失敗 並打破了第一個。

這似乎是EhCache實例衝突的問題。

這裏是碼頭日誌:

... 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
     at java.lang.reflect.Method.invoke(Unknown Source) 
     at org.eclipse.jetty.start.Main.invokeMain(Main.java:469) 
     at org.eclipse.jetty.start.Main.start(Main.java:612) 
     at org.eclipse.jetty.start.Main.parseCommandLine(Main.java:265) 
     at org.eclipse.jetty.start.Main.main(Main.java:79) 
Caused by: net.sf.ehcache.ObjectExistsException: Cache play already 
exists 
     at net.sf.ehcache.CacheManager.addCache(CacheManager.java:859) 
     at play.cache.EhCacheImpl.<init>(EhCacheImpl.java:32) 
     at play.cache.EhCacheImpl.newInstance(EhCacheImpl.java:41) 
     at play.cache.Cache.init(Cache.java:241) 
     at play.Play.start(Play.java:511) 
     ... 42 more 

任何幫助是極大的讚賞。

回答

1

當您使用共享jar時,Jetty將使用系統的Classloader加載共享jar內的類。而且,由於Play EhCacheImpl(幾乎)是單身人士,所以第二個應用程序將會影響第一個應用程序,反之亦然。這是您現在正在獲得的例外情況:Play正試圖在相同的類加載器中實例化兩個具有相同名稱的緩存。我可以考慮一下以下解決方案:

  1. 修復Playframework,以便它可以處理這種情況
  2. 使用自己的緩存實現(不知道這是防止你的這兩個應用程序一起工作的唯一的東西)
  3. 爲每個應用程序使用通用設置和複製罐子。

選項3對我來說聽起來更好,因爲您不必爲框架提供機會,而且它對於迴歸錯誤也更安全。關於內存佔用情況,您可以使用visualvm來驗證內存消耗是否明顯不同以證明共享JAR的正確性。