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

时间:2011-12-20 23:41:07

标签: deployment playframework shared-libraries

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

根据this post,显然有可能提取出来 每个PrjName.war/WEB-INF/lib目录和位置的公共库 它们进入共享的lib目录,即jetty/lib/ext

我们会有大量较小的独立项目 喜欢用Play实现!但都需要部署在同一个地方 Jetty实例共享所有库以减少RAM使用。我的假设是正确的,共享相同lib的几个项目会减少整体内存占用量吗?

我尝试将所有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

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

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

  1. 修复Play框架以便它可以处理这种情况
  2. 使用您自己的缓存实现(不确定这是否是阻止两个应用程序协同工作的唯一方法)
  3. 使用常用设置并为每个应用程序复制jar。
  4. 选项3对我来说听起来更好,因为你没有机会使用框架,而且对于回归错误它也更安全。关于内存占用,您可以使用visualvm来验证内存消耗是否明显不同以证明共享jar的合理性。