部署具有多个版本依赖项的多模块Tomcat应用程序

时间:2015-04-27 21:14:32

标签: java maven tomcat

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

模块A:

<ion-popover-view style="height: 120px">
  <ion-content>
    <div class="list">
      <a class="item">
        Compartir
      </a>
      <a class="item">
        Eliminar
      </a>
    </div>
  </ion-content>
</ion-popover-view>

模块B:

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

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

1 个答案:

答案 0 :(得分:1)

欢迎来到jar地狱。首先,两个潜在的快速胜利:

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

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

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