这可能是一个非常基本的问题,但是如果这是众所周知的并且在其他地方已解决,请帮助我。
我有一个多战设置(所有Maven模块)说kilo-webapp1
和kilo-webapp2
作为我需要在Tomcat实例上部署的两个WAR。这两个Web应用程序都使用来自公共服务jar的服务,例如kilo-common-services.jar
。 kilo-common-services.jar
具有自己的spring上下文,该上下文由jar viz的用户加载。在这种情况下为kilo-webapp1
和kilo-webapp2
。碰巧发生的是,在千公分服务中初始化服务需要很长时间,因此我希望它仅发生一次(以确保启动实例所花费的时间不是很高),这也对我有帮助将其用作第二级缓存,它在JVM实例中保持最新状态。为此,我们采取以下步骤:
shared.loader
作为${catalina.base}/shared/lib
kilo-common-services.jar
及其所有从属jar复制到CATALINA_BASE/shared/lib
。 [手动步骤] CATALINA_BASE/shared/lib
位置[手动步骤] beanRefContext.xml
中创建了一个kilo-common-services.jar
文件。在此处定义一个新的ClassPathXmlApplicationContext
,在其中为构造函数提供了通用服务的spring上下文文件的位置。 kilo-common-services.jar
和provided
pom文件中kilo-webapp1
的依赖范围和其他所有依赖关系(例如与Spring相关的jars)。对于Spring,需要确保不会两次触发类路径扫描操作。如果未通过kilo-webapp2
范围排除,这也会导致不同的ClassCastException
(对于log4j而言)。 provided
和kilo-webapp1
的kilo-webapp2
中定义的servicesContext
。 我能够验证公斤公共服务中只有一个服务实例存在,但是您可能想像的设置很痛苦。如果有人在Eclipse之类的IDE中具有关于此类设置的最佳实践,将不胜感激。我的问题如下:
kilo-common-services.jar
上运行mvn dependency:copy-dependencies
,将相关的jar从kilo-common-services
复制到target/dependency
,这是一个非常痛苦的手动步骤。我一次又一次忘记重新生成依赖关系,而不得不再次进行重新部署。 而且随着时间的流逝,将需要共享更多这样的不同的普通罐子,并且每个罐子都将遭受痛苦。随意批判该设置,并在可能易于使用的位置(以及从IDE)中提出一个更好的设置。很乐意提供其他详细信息。
提前致谢!
最佳答案
问题在于您的体系结构已损坏(这就是为什么您在解决方案中苦苦挣扎的原因)。您有两种解决方案:
1)如果您要在两个战争应用程序之间共享花费很长时间(初始化)的服务,请完全将该服务设为单独的服务,并通过休息或任何远程处理方式访问它。
2)将两个Web应用程序合并为一个。
拥有公共库的是共享的lib文件夹,这会给您带来很多麻烦,并且最终您会将其回滚。
我的(个人)方法是合并两个应用程序,但要使软件包足够分开并具有独立的spring配置。这样,至少您仍然保持两个Web应用程序的逻辑分离。
同样,由于两者都在同一个容器上运行,因此进行两次单独的战争并没有什么好处(除非您计划很快将它们转移到不同的容器中)。
关于IDE,您可以使用maven-cargo-plugin通过具有(几乎)所需任何配置的多个Web应用程序来启动tomcat。