java - 使用 maven 在 tomcat 中使用共享父 spring 上下文处理多 war 设置

标签 java eclipse spring tomcat maven

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

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

  1. 将tomcat中CATALINA_BASE的catalina.properties修改为shared.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在这里,为构造函数提供了公共(public)服务的 spring 上下文文件的位置。
  5. 注意到kilo-common-services.jar的依赖范围和所有其他依赖项(如 Spring 相关的 jar )为 providedkilo-webapp1kilo-webapp2 pom 文件。对于 Spring,这是确保类路径扫描操作不会被触发两次所必需的。这也会导致不同的 ClassCastException s(对于 log4j 让我们说)如果没有通过 provided 排除范围。
  6. kilo-webapp1 的 web.xml和 kilo-webapp2表示它们的 parentContext 是 servicesContextkilo-common-services.jar 中定义.

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

  • #2 正在成为一个挑战。我目前正在运行 mvn dependency:copy-dependencieskilo-common-servicestarget/dependency 复制相关的 jar到 shared/lib这是一个可悲的手动步骤。一次又一次,我忘记重新生成依赖关系,不得不再次重新部署。
  • #3 也不是直截了当的,因为一次又一次有更新的公共(public)依赖项,我们总是必须记住将它复制到共享库以避免 ClassCastExceptions
  • #5 又是一场维护噩梦。

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

提前致谢!

最佳答案

问题在于您的架构已损坏(这就是您苦苦寻找解决方案的原因)。您有两个解决方案:

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

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

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

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


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

关于java - 使用 maven 在 tomcat 中使用共享父 spring 上下文处理多 war 设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14067855/

相关文章:

java - 使用 JSON 列表的 HTTP 客户端发送和解析响应

python - libjpeg.so.62 : cannot open shared object file: No such file or directory

windows - 在 Eclipse 中创建新的 gradle 项目时无法选择完成

java - 编译代码时找不到 writeStringToFile(File,String,Charset) 合适的方法

java - Firefox WebDriver : Failed to connect to binary

java - 根据小时对数据进行分组

java - Neon 中的 Eclipse 格式化程序更改

java - Mongodb 非法访问异常

java - 将 session 范围的 bean Autowiring 到线程中(Spring)

java - 在 MockMvcResultHandlers 中找不到 get() 方法