我正在运行一个 tomcat 8 容器,其中包含 2 个不同的 web 应用程序、1 个产品和 1 个沙箱。所有类/库和编译都是相同的,只是配置参数有一些细微的差异。我正在使用 lucene core 4.10.4(通过 hibernate 搜索)。两个应用程序启动都很好,现在启动后,如果我在一个应用程序(比如说产品)上使用搜索,一切都会正常。当我尝试搜索第二个出现此错误的应用程序时,问题就出现了
... 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$1, 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$1.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 加载我第二次访问搜索的应用程序所需的类时引起的。
我在 stackoverflow 和网上找到的所有内容都讨论了链接错误,这是由于 web 应用程序从不同的库加载相同的类或需要使用不同的 java 版本编译的类。但在这种情况下,这是两个不同的应用程序,这很奇怪,并且它们都可以正常工作,直到您在干净的 tomcat 启动后在第一个应用程序上使用搜索后,在第二个应用程序上使用搜索。我能找到的最接近的相关问题是 this for a project named clarity .
我整晚都在用头撞墙,不知道它可能是什么,也不知道该去哪里寻找。
最佳答案
在进行了一些更多的调试之后,我决定更新 jdk,以便 100% 确保 openjdk 1.7u79(从 1.7_05 开始)。这似乎已经解决了问题。 Lucene 说至少使用更新 55,因为低于该版本有一些 JVM 错误(直到最近我还在使用早期版本的 lucene)。由于需要第二个应用程序来触发错误的奇怪情况,我没有自动跳转到尝试此操作。
关于java - 当 2 个 webapp 实例加载 lucene 类时 Tomcat 中出现链接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30703738/