【问题标题】:Deploying a multi-module Tomcat app with multiple versions of a dependency部署具有多个版本依赖项的多模块 Tomcat 应用程序
【发布时间】:2015-04-27 21:14:31
【问题描述】:

我有一个要在 Tomcat 中部署的 webapp,其中有两个模块具有各自的依赖项。我遇到了一个问题,其中模块 A 中的一个库的依赖项的版本比模块 B 中不同库所需的版本旧得多。例如,以下是 pom 文件中的依赖项:

模块 A:

<dependencies>
    <dependency>
        <groupId>org.example.com</groupId>
        <artifactId>libraryA</artifactId>
        <version>1.0</version>
    </dependency>
</dependencies>

模块 B:

<dependencies>
    <dependency>
        <groupId>org.another.com</groupId>
        <artifactId>libraryB</artifactId>
        <version>1.0</version>
    </dependency>
</dependencies>

libraryA 依赖于 libraryC 1.0 版,而 libraryB 依赖于 libraryC 2.0 版。 libraryA 将无法与 libraryC 的新版本一起使用,而 libraryB 将无法与 libraryC 的旧版本一起使用。我有哪些选择(如果有的话)让这些模块存在于同一个 Tomcat webapp 中,使用这些依赖项的不同版本?

【问题讨论】:

    标签: java maven tomcat


    【解决方案1】:

    欢迎来到罐子地狱。首先,两个潜在的快速获胜:

    • 也许你可以选择一些中间版本的 libraryC
    • 也许您可以将 libraryA 和 libraryB 迁移到 libraryC 的最新版本。如果它是开源的,只需执行拉取请求

    如果这不是一个选项,那么您将有更多的工作。经验法则:你不能拥有同一类的不同版本。没有灵丹妙药,但有一些解决方法。

    • 拆分应用程序。微服务架构通常在这里有所帮助,但需要大量基础设施(监控、部署、配置等)
    • OSGI。我从来没有使用过它,所以我不知道你是否以及如何将它与 tomcat 集成,但 osgi 是一个更好的依赖管理(包括版本控制)的平台
    • 重新包装。有一些工具可以获取库 x.y.z 的现有源代码(不确定编译类如何)并创建镜像库 a.b.c。在那一刻之后,它们具有不同的名称,因此它们可以轻松共存。它不适用于每个库,因为其中一些库使用反射来引用自己
    • 不同的类加载器。您可以尝试使用一个类加载器加载应用程序中的几乎所有内容,libC v1 与第二个类加载器,libC v2 与第三个类加载器。但它可能需要一些自定义,甚至可能需要自定义类加载器。稍后您可能会遇到兼容性问题,因为类加载器 1 中的 A 类不是类加载器 2 中 A 类的实例。

    【讨论】:

      猜你喜欢
      • 2021-10-05
      • 2014-09-09
      • 1970-01-01
      • 1970-01-01
      • 2010-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-20
      相关资源
      最近更新 更多