我在Liferay应用程序中有几个Singleton类,它们包含几个配置参数,ServiceLocator包含我需要使用的Web服务实例。
我已将这些类放在一个jar中,该jar被声明为对我所有portlet的依赖。
问题是,我已经在这些单例类中放置了一些用于初始化的日志记录行,当我部署我的portlet时,我可以多次看到这些行,每个portlet一次,因为每个portlet都有自己的类上下文。
对于AppConfig类,它可能不是什么大问题,但我的ServiceLocator实际上确实持有一堆带有大量内存的引用。
有没有办法可以将这些Singleton引用放在Liferay Portal中的某种共享上下文中?
答案 0 :(得分:3)
问题是每个Portlet都在自己的WAR文件中运行,而aech war文件有自己的类加载器。
通常当我必须达到这样的要求时,我不得不将Singleton classen放在JAR文件中,并将此JAR文件放在公共类加载器库中,而不是将其打包到每个WAR中。 (在Tomcat中:<tomcatHome>/common/lib
或类似的东西)
然后,您还必须将所有依赖库放入该公共lib目录中。但是,不知道如何在Liferay中做到这一点。对于tomcat,请参阅以下主题:stackoverflow.com/questions/267953/和本文档:http://tomcat.apache.org/tomcat-7.0-doc/class-loader-howto.html。取决于Servlet容器。
答案 1 :(得分:2)
亚历山大的答案给出了一般答案,无论有没有Liferay,都是如此。
全球类路径(亚历山大的回答)然而,立即成功,而ServiceBuilder有自己的学习曲线,并引入了一些更多的依赖。我不介意那些依赖,但你的里程可能会有所不同。自己决定
答案 2 :(得分:0)
使用maven portlet,您可以创建一个公共Spring组件并导入每个portlet的pom。 另一种解决方案是使用服务构建器。 Spring MVC portlet将是最推荐的。