如何解决导致JAR 冲突的外部库?

How to solve external library causing JAR conflicts?

我在我的应用程序中使用了 Lucene 5.0,我还使用了 DISCO java library,而后者又使用了 Lucene 3.5。当我导入 DISCO jar 时,我无法再 运行 程序,因为我收到关于 Lucene 类 的 运行 时间错误,这些错误在库的两个版本之间发生冲突。

有办法解决吗?

是的。一共有三种解决方案:

  1. 您可以将代码降级以使用 Lucene 3.5
  2. 您可以升级 DISCO 以使用 Lucene 5.0(您自己或让 DISCO 团队来做)
  3. 您可以使用几个 ClassLoader 来隔离代码。

最后一点是有效的,因为 Java 中的两个 类 是相同的,如果完全限定名称是相同的 当它们被相同 ClassLoader.

OSGi framework 可以做这样的把戏。 Eclipse 使用 Equinox,它是 OSGi 的一个实现。

一种选择是捆绑所有内容并设置 OSGi 以正确加载内容。

要自己解决问题,您可以创建两个 ClassLoader。一个加载您的应用程序和 Lucene 5.0。其他加载 DISCO 和 Lucene 3.5。

丑陋的部分是您现在可以在 Lucene 中为 类 获得 ClassCastException。它们将具有相同的名称,但就 Java 而言它们不会相同(不同的类加载器)。为了能够在两个类加载器之间传递数据,您需要一个具有 POJO 的父级 ClassLoader,您可以在其中放置所有要共享的数据。 java.lang.String也会在这个ClassLoader里面(不然事情会非常非常复杂)

共享依赖项也可以放在父项中 ClassLoader

然后您需要在 DISCO/Lucene 代码之上有一个薄的适配器层,它允许您在不使用此类加载器不喜欢的任何 类 的情况下执行您想要的操作。