这可能是一个非常基本的问题,但如果这是众所周知的并且已经在其他地方解决了,请帮助我。
我有一个多 war 设置(所有 Maven 模块)说 kilo-webapp1
和 kilo-webapp2
作为我需要在 Tomcat 实例上部署的两个 WAR。这两个 webapps 都使用来自公共(public)服务 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
在这里,为构造函数提供了公共(public)服务的 spring 上下文文件的位置。 - 注意到
kilo-common-services.jar
的依赖范围和所有其他依赖项(如 Spring 相关的 jar )为provided
在kilo-webapp1
和kilo-webapp2
pom 文件。对于 Spring,这是确保类路径扫描操作不会被触发两次所必需的。这也会导致不同的ClassCastException
s(对于 log4j 让我们说)如果没有通过provided
排除范围。 kilo-webapp1
的 web.xml和kilo-webapp2
表示它们的 parentContext 是servicesContext
在kilo-common-services.jar
中定义.
我能够验证只有一个 kilo-common-services 服务实例存在,但是您可能想象的那样设置很痛苦。如果有人在像 Eclipse 这样的 IDE 中有关于此类设置的最佳实践,将不胜感激。我的问题如下:
- #2 正在成为一个挑战。我目前正在运行
mvn dependency:copy-dependencies
在kilo-common-services
从target/dependency
复制相关的 jar到shared/lib
这是一个可悲的手动步骤。一次又一次,我忘记重新生成依赖关系,不得不再次重新部署。 - #3 也不是直截了当的,因为一次又一次有更新的公共(public)依赖项,我们总是必须记住将它复制到共享库以避免 ClassCastExceptions
- #5 又是一场维护噩梦。
此外,随着时间的推移,将有更多此类不同的通用 jar 需要共享,并且每个 jar 都会带来痛苦。随意批评设置并提出一个更好的设置,它可能易于使用(也来自 IDE)。很乐意提供任何其他详细信息。
提前致谢!
最佳答案
问题在于您的架构已损坏(这就是您苦苦寻找解决方案的原因)。您有两个解决方案:
1) 如果您想在两个 war 应用程序之间共享一个需要很长时间(初始化)的服务,请将该服务完全设为一个单独的服务并通过 rest 或任何类型的远程处理访问它。
2) 将两个 webapps 合并为一个。
拥有公共(public)库是共享库文件夹会给你带来很多麻烦,你最终会回滚它。
我的(个人)方法是合并两个应用程序,但保持包足够独立并具有单独的 spring 配置。这样,至少你仍然保持了两个 webapps 的逻辑分离。 此外,由于两者都在同一个容器上运行,因此进行 2 次单独的 war 几乎没有什么好处(除非您计划很快将它们移动到不同的容器)。
关于 IDE,您可以使用 maven-cargo-plugin 启动带有多个 Web 应用程序的 tomcat(几乎)任何您想要的配置。
关于java - 使用 maven 在 tomcat 中使用共享父 spring 上下文处理多 war 设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14067855/