我在我的应用程序中使用了Lucene 5.0
,我也在使用DISCO
java library,而{{3}}依次使用Lucene 3.5
。当我导入DISCO jar时,我无法再运行该程序,因为我得到关于两个版本的库之间存在冲突的Lucene类的运行时错误。
有没有办法解决这个问题?
答案 0 :(得分:1)
是。有三种解决方案:
ClassLoader
来隔离代码。最后一点是有效的,因为如果完全限定名称与同一个ClassLoader
加载完全限定名称和时,Java中的两个类是相同的。
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代码之上添加一个瘦适配器层,这样您就可以在不使用此类加载器不喜欢的任何类的情况下执行所需的操作。