这可能是一个非常基本的问题,但如果这是众所周知的并且已在其他地方解决,请帮助我。
我有一个多战争设置(所有 maven 模块),我需要在 Tomcat 实例上部署两个 WAR kilo-webapp1
。kilo-webapp2
这两个 webapp 都使用来自一个公共服务 jar 的服务,比如kilo-common-services.jar
. 它kilo-common-services.jar
有自己的 spring 上下文,由 jar 即用户加载。在这种情况下kilo-webapp1
。kilo-webapp2
碰巧kilo-common-services中的服务初始化需要很长时间,因此我希望它只发生一次(以确保启动实例所需的时间不是很高),这也对我有帮助将其用作在 JVM 实例中保持最新的二级缓存。为此,我们采取了以下步骤:
- 修改tomcat中CATALINA_BASE的catalina.properties
shared.loader
为${catalina.base}/shared/lib
kilo-common-services.jar
将及其所有依赖的 jar复制到CATALINA_BASE/shared/lib
. [手动步骤]- 将 spring 相关的 jar 复制到该
CATALINA_BASE/shared/lib
位置 [手动步骤] - 中创建了一个
beanRefContext.xml
文件kilo-common-services.jar
。在此处定义一个新ClassPathXmlApplicationContext
的,其中为构造函数提供了公共服务的 spring 上下文文件的位置。 - 注意到和pom 文件中的
kilo-common-services.jar
所有其他依赖项(如 Spring 相关 jars)的依赖项范围。对于 Spring,这需要确保不会触发两次类路径扫描操作。如果没有通过范围排除,这也会导致不同的 s (比如说 log4j) 。provided
kilo-webapp1
kilo-webapp2
ClassCastException
provided
- web.xml
kilo-webapp1
并kilo-webapp2
表示它们的 parentContext 是servicesContext
在kilo-common-services.jar
.
我能够验证只有一个kilo-common-services 服务实例存在,但是您可能想象的设置很痛苦。如果有人在 Eclipse 之类的 IDE 中进行此类设置的最佳实践,将不胜感激。我的问题如下:
- #2 正在成为一个挑战。我目前正在运行将
mvn dependency:copy-dependencies
依赖 的kilo-common-services
jar 从复制target/dependency
到shared/lib
其中,这是一个非常糟糕的手动步骤。一次又一次,我忘记重新生成依赖项,不得不再次进行重新部署。 - #3 也不是直截了当的,因为一次又一次有更新的常见依赖项,我们总是必须记住将其复制到共享库以避免 ClassCastExceptions
- #5 再次成为维护的噩梦。
同样随着时间的推移,将有更多这样不同的普通罐子需要共享,并且每个罐子都会带来痛苦。随意批评设置并提出一个更好的设置,它可能易于使用(也来自 IDE)。很乐意提供任何其他细节。
提前致谢!