玩!框架,单个Jetty实例,部署多个项目,共享库

Tin*_*ino 7 deployment shared-libraries playframework

我正在尝试部署两个或更多独立播放!(1.2.4)基于同一Jetty实例的项目.

根据这篇文章,显然可以从每个PrjName.war/WEB-INF/lib目录中提取公共库,并将它们放入共享的lib目录中,即jetty/lib/ext.

我们希望使用Play实现大量较小的独立项目!但是所有需要部署在共享所有库的同一个Jetty实例中以减少RAM使用.我的假设是否正确,共享相同lib的几个项目将减少整体内存占用量?

我尝试将所有库放在一个共享位置,即为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
Run Code Online (Sandbox Code Playgroud)

任何帮助是极大的赞赏.

mar*_*ira 1

当您使用共享 jar 时,Jetty 将使用系统的类加载器来加载共享 jar 中的类。而且,由于 Play EhCacheImpl(几乎)是单例,因此启动的第二个应用程序将影响第一个应用程序,反之亦然。这就是您现在遇到的异常:Play 正在尝试在相同的类加载器中以相同的名称实例化两个缓存。我可以考虑以下解决方案:

  1. 修复 Playframework 使其能够处理这种情况
  2. 使用您自己的缓存实现(不确定这是否是阻止两个应用程序一起工作的唯一原因)
  3. 使用通用设置并为每个应用程序复制 jar。

选项 3 对我来说听起来更好,因为您不必冒险框架,而且对于回归错误来说它也更安全。关于内存占用,您可以使用 VisualVM 来验证内存消耗是否显着不同,以证明共享 jar 的合理性。