[英]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正在尝试使用相同的名称在同一个类加载器中实例化两个缓存。 我可以考虑以下解决方案:
选项3对我来说听起来更好,因为你没有机会框架,它对于回归错误也更安全。 关于内存占用,您可以使用visualvm来验证内存消耗是否明显不同以证明共享jar的合理性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.