这可能是一个非常基本的问题,但是如果这是众所周知的并且在其他地方已解决,请帮助我。

我有一个多战设置(所有Maven模块)说kilo-webapp1kilo-webapp2作为我需要在Tomcat实例上部署的两个WAR。这两个Web应用程序都使用来自公共服务jar的服务,例如kilo-common-services.jarkilo-common-services.jar具有自己的spring上下文,该上下文由jar viz的用户加载。在这种情况下为kilo-webapp1kilo-webapp2。碰巧发生的是,在千公分服务中初始化服务需要很长时间,因此我希望它仅发生一次(以确保启动实例所花费的时间不是很高),这也对我有帮助将其用作第二级缓存,它在JVM实例中保持最新状态。为此,我们采取以下步骤:

  • 在tomcat中修改CATALINA_BASE的catalina.properties,使其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.jarprovided pom文件中kilo-webapp1的依赖范围和其他所有依赖关系(例如与Spring相关的jars)。对于Spring,需要确保不会两次触发类路径扫描操作。如果未通过kilo-webapp2范围排除,这也会导致不同的ClassCastException(对于log4j而言)。
  • providedkilo-webapp1
  • web.xml指示它们的parentContext是kilo-webapp2中定义的servicesContext

  • 我能够验证公斤公共服务中只有一个服务实例存在,但是您可能想像的设置很痛苦。如果有人在Eclipse之类的IDE中具有关于此类设置的最佳实践,将不胜感激。我的问题如下:
  • #2正在成为一个挑战。我目前正在kilo-common-services.jar上运行mvn dependency:copy-dependencies,将相关的jar从kilo-common-services复制到target/dependency,这是一个非常痛苦的手动步骤。我一次又一次忘记重新生成依赖关系,而不得不再次进行重新部署。
  • #3也不是简单易懂,因为经常会有新的通用依赖项,我们始终必须记住将其复制到共享库中,以避免ClassCastExceptions
  • #5再次成为维护噩梦。

  • 而且随着时间的流逝,将需要共享更多这样的不同的普通罐子,并且每个罐子都将遭受痛苦。随意批判该设置,并在可能易于使用的位置(以及从IDE)中提出一个更好的设置。很乐意提供其他详细信息。

    提前致谢!

    最佳答案

    问题在于您的体系结构已损坏(这就是为什么您在解决方案中苦苦挣扎的原因)。您有两种解决方案:

    1)如果您要在两个战争应用程序之间共享花费很长时间(初始化)的服务,请完全将该服务设为单独的服务,并通过休息或任何远程处理方式访问它。

    2)将两个Web应用程序合并为一个。

    拥有公共库的是共享的lib文件夹,这会给您带来很多麻烦,并且最终您会将其回滚。

    我的(个人)方法是合并两个应用程序,但要使软件包足够分开并具有独立的spring配置。这样,至少您仍然保持两个Web应用程序的逻辑分离。
    同样,由于两者都在同一个容器上运行,因此进行两次单独的战争并没有什么好处(除非您计划很快将它们转移到不同的容器中)。

    关于IDE,您可以使用maven-cargo-plugin通过具有(几乎)所需任何配置的多个Web应用程序来启动tomcat。

    08-17 18:55