如何在 pom.xml 中使用两个版本的 itext jar 文件?

How use two verions of itext jar files in pom.xml?

在我的项目中,我有依赖项 displaytagbirt-runtime。这里显示标签需要 itext-2.0.1.jar 并且 birt-runtime 需要 itext-2.1.7.jar 那么我如何在我的 pom.xml 中声明它以仅通过显示标签使用 itext-2.0.1.jar 并使用 itext-2.1.7.jar 只有 birt-runtime。有人可以让我知道如何实现这一目标吗? 提前致谢。

在正常的 java 应用程序中这是不可能的,因为在应用程序中 itext 2.1 和 2.0 将共享相同的类加载器。 但通常,java-api 会考虑向后兼容性,因此应该可以只包含 2.1。

如果没有,你需要多个类加载器,然后它会变得复杂。

现有解决方案:

  • 您可以尝试将 OSGi 容器添加到您的应用程序,然后 运行 这两个依赖项作为一个单独的 osgi-bundle。
  • 如果你运行一个jboss 应用程序服务器,您可以创建一个带有 displaytag 和 另一个带有 birt-运行time.

自己动手:

  • 我从未这样做过,但您可以尝试创建以在您的应用程序中管理您自己的类加载器,并将依赖的 jar 加载到每个自己的类加载器中。这个 article 似乎涵盖了主题。

简答:不能。

长答案:Maven 是一个构建工具,对应用程序中的运行时 class 加载没有影响。通常它生成的是一个(或多个)工件,通常是 jar 或 war 文件,这些文件可能包含也可能不包含您项目的依赖项(取决于您的 POM 文件)。

你想要实现的是 class 加载器在运行时完成的,但在正常情况下你不想篡改 class 加载。

您可以做的是:

  1. 通过定义 exclusions 排除 pom 中不必要的依赖传递依赖,这样只会使用一个版本的 itext。当然,这仅在您的依赖项不依赖 itext 的内部并且它们的 public API 兼容时才有效,但这可能是最干净和最简单的解决方案。

  2. 使用对 class 加载有更强控制的 framework/container,例如 OSGi 容器。这些容器提供带有 "private" class 加载程序的捆绑包(有点等同于工件),使您的应用程序能够加载同一库的多个版本,而不会相互干扰。但是,此解决方案还有其他缺点,如果您已经熟悉 OSGi,我只会推荐此解决方案。