如何解决导致JAR 冲突的外部库?
How to solve external library causing JAR conflicts?
我在我的应用程序中使用了 Lucene 5.0
,我还使用了 DISCO
java library,而后者又使用了 Lucene 3.5
。当我导入 DISCO jar 时,我无法再 运行 程序,因为我收到关于 Lucene 类 的 运行 时间错误,这些错误在库的两个版本之间发生冲突。
有办法解决吗?
是的。一共有三种解决方案:
- 您可以将代码降级以使用 Lucene 3.5
- 您可以升级 DISCO 以使用 Lucene 5.0(您自己或让 DISCO 团队来做)
- 您可以使用几个
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 代码之上有一个薄的适配器层,它允许您在不使用此类加载器不喜欢的任何 类 的情况下执行您想要的操作。
我在我的应用程序中使用了 Lucene 5.0
,我还使用了 DISCO
java library,而后者又使用了 Lucene 3.5
。当我导入 DISCO jar 时,我无法再 运行 程序,因为我收到关于 Lucene 类 的 运行 时间错误,这些错误在库的两个版本之间发生冲突。
有办法解决吗?
是的。一共有三种解决方案:
- 您可以将代码降级以使用 Lucene 3.5
- 您可以升级 DISCO 以使用 Lucene 5.0(您自己或让 DISCO 团队来做)
- 您可以使用几个
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 代码之上有一个薄的适配器层,它允许您在不使用此类加载器不喜欢的任何 类 的情况下执行您想要的操作。