使用maven在tomcat中使用共享父spring语境处理多战设置

时间:2012-12-28 10:07:02

标签: java eclipse spring tomcat maven

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

我有一个多战设置(所有maven模块)说kilo-webapp1kilo-webapp2作为我需要在Tomcat实例上部署的两个WAR。这两个webapp都使用来自公共服务jar的服务,比如kilo-common-services.jarkilo-common-services.jar有自己的spring上下文,由jar用户加载。在这种情况下,kilo-webapp1kilo-webapp2。事实上,千公共服务中的服务初始化需要很长时间,因此我希望它只发生一次(以确保启动实例所需的时间不是很高)这也有助于我将它用作二级缓存,它在JVM实例中保持最新。为此,我们采取了以下步骤:

  1. 修改tomcat中CATALINA_BASE的catalina.properties,使shared.loader${catalina.base}/shared/lib
  2. kilo-common-services.jar及其所有相关的jar复制到CATALINA_BASE/shared/lib。 [手动步骤]
  3. 将弹簧相关的罐子复制到CATALINA_BASE/shared/lib位置[手动步骤]
  4. beanRefContext.xml中创建了kilo-common-services.jar个文件。在这里定义一个新的ClassPathXmlApplicationContext,其中为构造函数提供了公共服务的spring上下文文件的位置。
  5. kilo-common-services.jarprovided pom文件中将kilo-webapp1和所有其他依赖项(如Spring相关的jar)的依赖范围注释为kilo-webapp2。对于Spring,需要确保类路径扫描操作不会被触发两次。如果没有通过ClassCastException范围排除,这会导致不同的provided s(对于log4j来说)。
  6. kilo-webapp1kilo-webapp2的web.xml表明,他们的parentContext是servicesContext中定义的kilo-common-services.jar
  7. 我能够验证只存在公共服务的一个服务实例,但您可能想到的设置很痛苦。如果某人在像Eclipse这样的IDE中有关于这种设置的最佳实践,那将非常感激。我的问题如下:

    • #2正在成为一项挑战。我目前正在mvn dependency:copy-dependencies上运行kilo-common-services,将相关的jars从target/dependency复制到shared/lib,这是一个非常糟糕的手动步骤。我一次又一次忘记重新生成依赖项,并且必须重新进行重新部署。
    • #3也不是直截了当,因为一次又一次有更新的常见依赖项,我们总是要记住将它复制到共享库以避免ClassCastExceptions
    • #5再次成为维护的噩梦。

    随着时间的推移,将会有更多这种不同的共同罐子需要分享,这将涉及每个罐子的痛苦。随意批评设置,并提出一个更好的设置,可以很容易使用(从IDE也是如此)。很乐意提供任何其他细节。

    提前致谢!

2 个答案:

答案 0 :(得分:2)

问题在于您的架构已经崩溃(这就是您为解决方案而苦苦挣扎的原因)。你有两个解决方案:

1)如果您想在两个war应用程序之间共享需要很长时间(初始化)的服务,请将其作为一个单独的服务,并通过休息或任何类型的远程处理来访问它。

2)将两个webapp合并为一个。

拥有公共库是共享的lib文件夹会给你带来很多麻烦,你最终会回滚它。

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


关于IDE,您可以使用maven-cargo-plugin启动一个带有几个Web应用程序的tomcat,几乎可以使用任何配置。

答案 1 :(得分:0)

我们正在开发宁静的soa,使用spring和tomcat并利用Domain Driven Design(无论如何都是计划)。有migrationProject和初始基本搜索服务。两个独立的WAR文件,带有两个独立的POM。两者都使用相同的Domain对象。

所以我将有一个单独的项目,它将只是DomainObjects我将它们包装到一个jar中,然后使用maven和/或jenkins它将自动部署(每当我配置时(例如当推送到特定的存储库时)

拥有同一个罐子的两个副本,对我来说听起来更糟糕。它不是你的架构坏了,它的部署和开发过程需要改进,imho。

my kind of related question)。

我们的长期计划是将一个项目作为restful接口,使用多个控制器,从其依赖项中将服务类和存储库注入其中。