Java 可转位场的奇异Lucene误差

Java 可转位场的奇异Lucene误差,java,lucene,Java,Lucene,我们意外地遇到了这个错误。以下是如何: 我们有一个基于Lucene版本3.6.0的Lucene搜索代码,运行得非常好。代码的编译以前是针对3.6.0版的。 我们使用的与Lucene相关的JAR已经存在于服务器上,所以我们不会将Lucene JAR与部署归档捆绑在一起。运行时引用服务器上的jar。 无意中,其中一名团队成员编译了针对Lucene 4.8.1的代码,没有任何代码更改。 当我们部署代码时,我们得到org/apache/lucene/index/IndexableField的ClassN

我们意外地遇到了这个错误。以下是如何:

我们有一个基于Lucene版本3.6.0的Lucene搜索代码,运行得非常好。代码的编译以前是针对3.6.0版的。 我们使用的与Lucene相关的JAR已经存在于服务器上,所以我们不会将Lucene JAR与部署归档捆绑在一起。运行时引用服务器上的jar。 无意中,其中一名团队成员编译了针对Lucene 4.8.1的代码,没有任何代码更改。 当我们部署代码时,我们得到org/apache/lucene/index/IndexableField的ClassNotFoundError。我们非常确信,我们不会直接或间接地在代码中的任何地方引用此类。我们使用多种工具搜索并确保了这一点。 我们使用3.6.0版重新编译了代码,然后一切正常。代码以3.6.0版本编译,没有任何问题。 类IndexableField仅在4.8.1版本中引入,在以前的任何版本中都没有引入。 我们正在使用JDK7 现在的问题是:


使用不同库版本编译同一源代码如何影响生成的字节码?在我们的代码中,我们从未提到IndexableField,但在编译代码中,当针对不同版本编译时,对IndexableField的引用会悄悄出现

代码是如何打包的?它打包为一个web应用程序。Lucene被拆分为多个JAR,因此您可能与其中一个JAR的版本不匹配。检查战争中的JAR版本,一个可能是3.6,另一个是4.8。战争中没有lucene JAR。我们的项目被捆绑成EAR。EAR中的公共lib文件夹具有与lucene相关的jar版本3.6.0。我们在dev/test设置中所做的不是部署整个EAR,而是在EAR中复制WAR文件夹。战争指的是共同耳库中的罐子。