java - 当 2 个 webapp 实例加载 lucene 类时 Tomcat 中出现链接错误

标签 java tomcat lucene jvm linkageerror

我正在运行一个 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/

相关文章:

java - Hibernate 有时会尝试先删除父实体,然后再删除子实体,而不是相反

java - 如何获取csv文件中每个字段的最大长度?

java - 区分 hibernate 中不同的约束违规

tomcat - 如何在 Tomcat 6/7 中滚动日志文件?

java - Lucene——过滤特定字段的文档

search - 如何缓存搜索结果?

java - 如何解决运行jar文件时出现 "Could not find or load main class"问题

SVN标签日志,什么意思?

java - Class.getResourceAsStream 的说明以及如何在 Tomcat 中为简单的 Java Web 应用程序设置它?

lucene - Alfresco:Lucene 按 ID 查询返回 2 行