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

时间:2015-06-08 07:50:11

标签: java tomcat lucene jvm linkageerror

我正在运行一个带有2个不同webapps,1个prod和1个沙箱的tomcat 8容器。所有类/库和编译都是相同的,只是配置参数中的一些细微差别。我正在使用lucene core 4.10.4(通过hibernate搜索)。两个应用程序启动都很好,现在启动后如果我在一个应用程序上使用搜索(让我们说prod)一切正常。当我尝试在第二个应用程序上搜索此错误

时,会出现此问题
  

...   引起:java.lang.LinkageError:加载器约束违规:解析方法时“java.lang.invoke.MethodHandle.invokeExact()Lorg / apache / lucene / util / AttributeImpl;”当前类的类加载器(org / apache / catalina / loader / WebappClassLoader的实例),org / apache / lucene / util / AttributeFactory $ 1,以及用于已解析类的类加载器(实例),java / lang / invoke / MethodHandle,具有类型的不同Class对象andle.invokeExact()Lorg / apache / lucene / util / AttributeImpl;用于签名       在org.apache.lucene.util.AttributeFactory $ 1.createInstance(AttributeFactory.java:140)       at org.apache.lucene.util.AttributeFactory $ StaticImplementationAttributeFactory.createAttributeInstance(AttributeFactory.java:103)       在org.apache.lucene.util.AttributeSource.addAttribute(AttributeSource.java:222)       在org.apache.lucene.analysis.standard.StandardTokenizer。(StandardTokenizer.java:182)       在org.apache.lucene.analysis.standard.StandardAnalyzer.createComponents(StandardAnalyzer.java:124)       在org.apache.lucene.analysis.AnalyzerWrapper.createComponents(AnalyzerWrapper.java:113)       在org.apache.lucene.analysis.AnalyzerWrapper.createComponents(AnalyzerWrapper.java:113)       在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和在线讨论中发现的关于链接错误的一切都是由于webapp加载了来自不同库的相同类或者需要使用不同java版本编译的类。但在这种情况下,它是2个不同的应用程序,这是奇怪的,它们都可以工作,直到你在第二个ap上使用它后,在一个干净的tomcat启动后在第一个应用程序上使用它。我能找到的最近的相关问题是this for a project named clarity

我整晚都在撞墙,无法弄清楚它可能是什么或者在哪里看。

1 个答案:

答案 0 :(得分:2)

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