3

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

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

  1. 修改tomcat中CATALINA_BASE的catalina.propertiesshared.loader${catalina.base}/shared/lib
  2. kilo-common-services.jar将及其所有依赖的 jar复制到CATALINA_BASE/shared/lib. [手动步骤]
  3. 将 spring 相关的 jar 复制到该CATALINA_BASE/shared/lib位置 [手动步骤]
  4. 中创建了一个beanRefContext.xml文件kilo-common-services.jar。在此处定义一个新ClassPathXmlApplicationContext的,其中为构造函数提供了公共服务的 spring 上下文文件的位置。
  5. 注意到和pom 文件中的kilo-common-services.jar所有其他依赖项(如 Spring 相关 jars)的依赖项范围。对于 Spring,这需要确保不会触发两次类路径扫描操作。如果没有通过范围排除,这也会导致不同的 s (比如说 log4j) 。providedkilo-webapp1kilo-webapp2ClassCastExceptionprovided
  6. web.xmlkilo-webapp1kilo-webapp2表示它们的 parentContext 是servicesContextkilo-common-services.jar.

我能够验证只有一个kilo-common-services 服务实例存在,但是您可能想象的设置很痛苦。如果有人在 Eclipse 之类的 IDE 中进行此类设置的最佳实践,将不胜感激。我的问题如下:

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

同样随着时间的推移,将有更多这样不同的普通罐子需要共享,并且每个罐子都会带来痛苦。随意批评设置并提出一个更好的设置,它可能易于使用(也来自 IDE)。很乐意提供任何其他细节。

提前致谢!

4

2 回答 2

2

问题是您的架构已损坏(这就是您在解决方案上苦苦挣扎的原因)。你有两个解决方案:

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

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

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

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


关于 IDE,您可以使用 maven-cargo-plugin 来启动一个带有多个 Web 应用程序的 tomcat,并且具有(几乎)任何您想要的配置。

于 2012-12-28T10:12:54.973 回答
0

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

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

拥有同一个罐子的两个副本,对我来说听起来是一个更糟糕的主意。不是您的架构被破坏,而是您的部署和开发过程需要改进,恕我直言。

我的相关问题)。

我们的长期计划是让一个项目作为 RESTful 接口,由多个控制器从它们的依赖项中注入服务类和存储库。

于 2012-12-28T11:49:41.210 回答