有没有办法在两次部署的战争之间共享应用程序上下文?一场战争需要接通另一场战争,我不知道从哪里开始。
答案 0 :(得分:12)
像tomcat这样的Web应用程序容器的一般用途是每个应用程序都能够独立运行(这样您就可以在不影响其他应用程序的情况下停止和启动各个应用程序),这意味着可能已经付出了很多努力。开发专门用来防止你这样做。因此,即使你发现了一个漏洞,我建议不要使用它,除非建议或至少由设计师批准。
我建议你开始寻找其他解决方案。例如:
答案 1 :(得分:12)
我们的团队也有同样的要求 - 在Tomcat中的多个WAR之间共享Spring bean,老实说,答案如“不要那样做”,#34;没用
该要求源于我们在Tomcat上运行多WAR应用程序,并且所有WAR都需要访问相同的RDBMS以获取持久性信息。我们使用Spring和Hibernate来访问RDBM,并且所有WAR共享相同的模式,理想情况下可以使用相同的Hibernate SessionFactory和Spring事务管理器。
关于如何做到的答案发布在这里:
StackOverflow: Sharing ApplicationContext within EAR
总结一下,您在web.xml中执行以下操作:
<context-param>
<param-name>parentContextKey</param-name>
<param-value>sharedContext</param-value>
</context-param>
<context-param>
<param-name>locatorFactorySelector</param-name>
<param-value>classpath:beanRefContext.xml</param-value>
</context-param>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:yourWarSpecificAppContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
其中beanRefContext.xml包含:
<beans>
<bean id="sharedContext" class="org.springframework.context.support.ClassPathXmlApplicationContext">
<constructor-arg>
<list>
<value>classpath:yourSharedAppContext.xml</value>
</list>
</constructor-arg>
</bean>
</beans>
这使用Spring ContextSingletonBeanFactoryLocator来公开和共享父上下文(在本例中使用名称&#34; sharedContext&#34;)。当第一个WAR引用它时,将延迟加载共享上下文。
您在共享上下文中引用的bean必须可以被所有WAR访问,这意味着它们无法从特定WAR中的WEB-INF / classes或WEB-INF / lib加载。必须使用EAR文件共享它们,或者将包含bean(和依赖项)的jar放入Tomcat共享&#34; lib&#34;文件夹($ CATALINA_HOME / lib),这是我们团队所做的。
公平警告,如果您使用此方法,您可能会将大多数JAR放在共享lib文件夹中而不是单独的Web应用程序中。对于我们的项目,这是有道理的,因为大多数webapp共享和访问相同的后端服务。
由于硬核Tomcat开发人员可能会反对将大量代码放入Tomcat共享库目录中,因此我只列举了其他建议答案可能不起作用的一些原因。
答案 2 :(得分:6)
答案 3 :(得分:1)
答案 4 :(得分:0)
您是否需要共享运行时上下文,或者您是否只想在两个应用程序中重用bean定义?
如果它只是后者,那么您可以轻松地将常见的Spring上下文XML文件提取到一些共享依赖项中,并且只需在两个Web应用程序中重用JAR。但是,如果您需要将每个应用程序中的bean / services与 talk 相互联系,则需要使用其他选项。
答案 5 :(得分:0)
如果上下文不存在,您可以将上下文绑定到JNDI。
这样做的代价是每个webapp的上下文都必须知道它可能不是主要的。
此外,你需要非常小心竞争条件,例如
答案 6 :(得分:0)
同意@RichardSmith,接受的答案对我没有帮助。虽然理查德的answer有助于指出我正确的方向,但我正在使用Jetty,所以我无法使用EAR。我最终使用服务器上下文在战争之间共享一个对象 - 即使使用热(重新)部署的webapps也可以工作:
https://stackoverflow.com/a/46968645/1287091
也可能是为Tomcat改编它的方法。