繁体   English   中英

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

[英]Play! framework, single Jetty instance, deploy multiple projects, share libs

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

根据这篇文章 ,显然可以从每个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

任何帮助是极大的赞赏。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM