当 2 个 webapp 实例加载 lucene 类 时 Tomcat 中的链接错误

Linkage Error in Tomcat when 2 webapp instances load lucene classes

我是 运行 一个 tomcat 8 容器,其中包含 2 个不同的网络应用程序、1 个产品和 1 个沙箱。所有 classes/libs 和编译都是相同的,只是配置参数有一些细微差别。我正在使用 lucene core 4.10.4(通过休眠搜索)。这两个应用程序启动都很好,现在启动后,如果我在一个应用程序上使用搜索(比方说产品)一切正常。当我尝试搜索第二个应用程序时出现此错误

... Caused by: java.lang.LinkageError: loader constraint violation: when resolving method "java.lang.invoke.MethodHandle.invokeExact()Lorg/apache/lucene/util/AttributeImpl;" the class loader (instance of org/apache/catalina/loader/WebappClassLoader) of the current class, org/apache/lucene/util/AttributeFactory, and the class loader (instance of ) for resolved class, java/lang/invoke/MethodHandle, have different Class objects for the type andle.invokeExact()Lorg/apache/lucene/util/AttributeImpl; used in the signature at org.apache.lucene.util.AttributeFactory.createInstance(AttributeFactory.java:140) at org.apache.lucene.util.AttributeFactory$StaticImplementationAttributeFactory.createAttributeInstance(AttributeFactory.java:103) at org.apache.lucene.util.AttributeSource.addAttribute(AttributeSource.java:222) at org.apache.lucene.analysis.standard.StandardTokenizer.(StandardTokenizer.java:182) at org.apache.lucene.analysis.standard.StandardAnalyzer.createComponents(StandardAnalyzer.java:124) at org.apache.lucene.analysis.AnalyzerWrapper.createComponents(AnalyzerWrapper.java:113) at org.apache.lucene.analysis.AnalyzerWrapper.createComponents(AnalyzerWrapper.java:113) at org.apache.lucene.analysis.Analyzer.tokenStream(Analyzer.java:144) at org.hibernate.search.query.dsl.impl.Helper.getAllTermsFromText(Helper.java:74) at org.hibernate.search.query.dsl.impl.ConnectedMultiFieldsTermQueryBuilder.getAllTermsFromText(ConnectedMultiFieldsTermQueryBuilder.java:172) at org.hibernate.search.query.dsl.impl.ConnectedMultiFieldsTermQueryBuilder.createQuery(ConnectedMultiFieldsTermQueryBuilder.java:89) at org.hibernate.search.query.dsl.impl.ConnectedMultiFieldsTermQueryBuilder.createQuery(ConnectedMultiFieldsTermQueryBuilder.java:64) ...

在第二个应用程序出错后,我仍然可以在第一个应用程序上搜索得很好。问题似乎是 tomcat 为我第二次访问搜索的应用程序加载所需的 类 时引起的。

我在 Whosebug 和在线讨论中发现的所有关于链接错误的内容都是由于 webapp 从不同的库加载相同的 类 或者需要 类 用不同的 java 编译版本。但在这种情况下,它是 2 个不同的应用程序,这很奇怪,它们都可以正常工作,直到您在干净 tomcat 启动后在第一个应用程序上使用搜索后在第二个应用程序上使用搜索。我能找到的最接近的相关问题是 this for a project named clarity.

我整晚都在用头撞墙,不知道它可能是什么,也不知道该去哪里看。

在白天做了一些调试后,我决定更新 jdk 只是为了 100% 确保打开 jdk 1.7u79(来自 1.7_05) .这似乎已经解决了这个问题。 Lucene 说至少要使用更新 55,因为它下面有一些 JVM 错误(直到最近我一直在使用早期版本的 lucene)。我没有自动跳到尝试这个,因为需要第二个应用程序来触发错误的奇怪情况。