【发布时间】:2012-12-28 10:07:01
【问题描述】:
这可能是一个非常初级的问题,但如果这是众所周知的并且已在其他地方解决,请帮助我。
我有一个多战争设置(所有 maven 模块)说 kilo-webapp1 和 kilo-webapp2 作为我需要在 Tomcat 实例上部署的两个 WAR。这两个 web 应用程序都使用来自公共服务 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位置 [手动步骤] - 在
kilo-common-services.jar中创建了一个beanRefContext.xml文件。在此处定义一个新的ClassPathXmlApplicationContext,其中为构造函数提供了公共服务的 spring 上下文文件的位置。 - 在
kilo-webapp1和kilo-webapp2pom 文件中将kilo-common-services.jar和所有其他依赖项(如Spring 相关的jar)的依赖范围标记为provided。对于 Spring,这需要确保不会触发两次类路径扫描操作。如果没有通过provided范围排除,这也会导致不同的ClassCastExceptions(比如说log4j)。 -
kilo-webapp1和kilo-webapp2的web.xml 表明它们的父上下文是kilo-common-services.jar中定义的servicesContext。
我能够验证只有一个kilo-common-services 服务实例存在,但是您可能想象的设置很痛苦。如果有人在 Eclipse 之类的 IDE 中进行此类设置的最佳实践,将不胜感激。我的问题如下:
- #2 正在成为一个挑战。我目前在
kilo-common-services上运行mvn dependency:copy-dependencies将依赖的jar 从target/dependency复制到shared/lib,这是一个非常糟糕的手动步骤。一次又一次,我忘记重新生成依赖项,不得不重新部署。 - #3 也不是直截了当的,因为经常有更新的常见依赖项,我们总是必须记住将其复制到共享库以避免 ClassCastExceptions
- #5 再次成为维护的噩梦。
此外,随着时间的推移,将有更多这样不同的普通罐子需要共享,并且每个罐子都会带来痛苦。随意批评设置并提出一个更好的设置,它可能易于使用(也来自 IDE)。很乐意提供任何其他详细信息。
提前致谢!
【问题讨论】:
-
kilo-common-services.jar 中的这些服务是什么类型的?网页服务 ?或者只是一种将用作通用代码的库功能?
-
常规图书馆进程内服务。
-
如果它只是一个通用代码库,我建议将其与两个 war 文件一起打包,并且您摆脱了在现实生活中通常会导致问题的单独部署步骤(共享库)。跨度>
-
我认为他想在应用程序上保留一个缓存,这就是为什么他只想要一个kilo-common实例。您可以使用分布式缓存,但这会增加很多复杂性:S.
-
@khmarbaise 我很想知道这些现实生活中的问题是什么,因为我认为这正是 maven、单元测试和持续集成旨在解决的问题......
标签: java eclipse spring tomcat maven