要在多个portlet

时间:2015-06-25 08:37:45

标签: java liferay

我在Liferay应用程序中有几个Singleton类,它们包含几个配置参数,ServiceLocator包含我需要使用的Web服务实例。

我已将这些类放在一个jar中,该jar被声明为对我所有portlet的依赖。

问题是,我已经在这些单例类中放置了一些用于初始化的日志记录行,当我部署我的portlet时,我可以多次看到这些行,每个portlet一次,因为每个portlet都有自己的类上下文。

对于AppConfig类,它可能不是什么大问题,但我的ServiceLocator实际上确实持有一堆带有大量内存的引用。

有没有办法可以将这些Singleton引用放在Liferay Portal中的某种共享上下文中?

3 个答案:

答案 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,都是如此。

Liferay(正如你所提到的)为此添加了另一个选项:ServiceBuilder。您将最终得到一个Web应用程序中包含的实际实例,并且您将拥有一个可以与每个依赖应用程序一起分发的接口jar。通过这种方式,您可以更轻松地更新您的实施:将新的和更新的Web应用程序热部署到您的应用程序服务器很容易 - 更新生活在全局类路径上的代码更加困难。

全球类路径(亚历山大的回答)然而,立即成功,而ServiceBuilder有自己的学习曲线,并引入了一些更多的依赖。我不介意那些依赖,但你的里程可能会有所不同。自己决定

答案 2 :(得分:0)

使用maven portlet,您可以创建一个公共Spring组件并导入每个portlet的pom。 另一种解决方案是使用服务构建器。 Spring MVC portlet将是最推荐的。