Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 要在多个Portlet之间共享的单例类_Java_Liferay - Fatal编程技术网

Java 要在多个Portlet之间共享的单例类

Java 要在多个Portlet之间共享的单例类,java,liferay,Java,Liferay,在Liferay应用程序中,我有两个单例类,其中包含几个配置参数和一个ServiceLocator,其中包含我需要使用的Web服务的实例 我将这些类放在一个jar中,该jar声明为我所有portlet的依赖项 问题是,我在这些单例类中放置了一些用于初始化的日志行,当我部署portlet时,我可以多次看到这些行,每个portlet一次,因为每个portlet都有自己的类上下文 对于AppConfig类来说,这可能没什么大不了的,但是我的ServiceLocator实际上包含了一堆占用大量内存的引用

在Liferay应用程序中,我有两个单例类,其中包含几个配置参数和一个ServiceLocator,其中包含我需要使用的Web服务的实例

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

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

对于AppConfig类来说,这可能没什么大不了的,但是我的ServiceLocator实际上包含了一堆占用大量内存的引用


有什么方法可以将这些单例引用放在我的Liferay门户中的某种共享上下文中吗?

Alexander的回答给出了在考虑Liferay或不考虑Liferay的情况下都是正确的一般答案

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


然而,全局类路径(Alexander的答案)为您带来了立竿见影的成功,而ServiceBuilder提供了自己的学习曲线,并引入了更多的依赖项。我不介意这些依赖性,但您的里程可能会有所不同。你自己决定

亚历山大的回答给出了一个大致的答案,不管是否考虑到了利弗雷,答案都是正确的

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


然而,全局类路径(Alexander的答案)为您带来了立竿见影的成功,而ServiceBuilder提供了自己的学习曲线,并引入了更多的依赖项。我不介意这些依赖性,但您的里程可能会有所不同。自己决定问题是每个Portlet都在自己的WAR文件中运行,而aech WAR文件有自己的类加载器

通常,当我必须实现这样的需求时,我必须将Singleton classen放在一个JAR文件中,将这个JAR文件放在公共类加载器库中,而不是将其打包到每个WAR中。(在Tomcat中:
/common/lib
或类似的东西)


然后,您还必须将所有依赖库也放入该公共lib目录中。但我不知道如何在Liferay中做到这一点。对于tomcat,请参阅以下线程:stackoverflow.com/questions/267953/以及以下文档:。取决于Servlet容器。

问题在于每个Portlet都在自己的WAR文件中运行,而aech WAR文件有自己的类加载器

通常,当我必须实现这样的需求时,我必须将Singleton classen放在一个JAR文件中,将这个JAR文件放在公共类加载器库中,而不是将其打包到每个WAR中。(在Tomcat中:
/common/lib
或类似的东西)


然后,您还必须将所有依赖库也放入该公共lib目录中。但我不知道如何在Liferay中做到这一点。对于tomcat,请参阅以下线程:stackoverflow.com/questions/267953/以及以下文档:。取决于Servlet容器。

使用maven portlet,您可以创建一个公共Spring组件,并在每个portlet的pom中导入。 另一个解决方案是使用ServiceBuilder。
SpringMVCPortlet是最推荐的解决方案。

使用MavenPortlet,您可以创建一个公共Spring组件,并在每个portlet的pom中导入。 另一个解决方案是使用ServiceBuilder。
Spring MVC portlet是最推荐的解决方案。

每个portlet都有自己的类加载器实例吗?是的,它们处于不同的网络环境中这就是问题所在!通常,当我必须实现这样的目标时,我必须将包含单例类的JAR放入公共类加载器库(在Tomcat:
/common/lib
或类似的库中),而不是将其打包到每个WAR中。问题是,您还必须将所有依赖库也放入该公共lib目录中。但我不知道如何在Liferay中做到这一点。对于tomcat,请查看以下线程:@Alexander这值得转换为一个答案-我想+1它每个Portlet是否都有自己的类加载器实例?是的,它们处于不同的网络温度这就是问题所在!通常,当我必须实现这样的目标时,我必须将包含单例类的JAR放入公共类加载器库(在Tomcat:
/common/lib
或类似的库中),而不是将其打包到每个WAR中。问题是,您还必须将所有依赖库也放入该公共lib目录中。但我不知道如何在Liferay中做到这一点。对于tomcat,请看以下帖子:@Alexander这是值得转换为答案的-我会+1它