Ошибка связывания в Tomcat, когда 2 экземпляра веб-приложения загружают классы lucene
Я использую контейнер Tomcat 8 с 2 различными веб-приложениями, 1 продуктом и 1 песочницей. Все классы / библиотеки и компиляция одинаковы с небольшими отличиями в параметрах конфигурации. Я использую Lucene Core 4.10.4 (через поиск в спящем режиме). Оба приложения запускаются просто отлично, теперь после запуска, если я использую поиск по одному приложению (скажем, 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) в org.apache.lucene.util.AttributeFactory$StaticImplementationAttributeFactory.createAttributeInavaTact.jpg lucene.util.AttributeSource.addAttribute(AttributeSource.java:222) в org.apache.lucene.analysis.standard.StandardTokenizer.(StandardTokenizer.java:182) в org.apache.lucene.lualneAnalnalenAnalyzerAnager..java:124) в org.apache.lucene.analysis.AnalyzerWrapper.createComponents(AnalyzerWrapper.java:113) в org.apache.lucene.analysis.AnalyzerWrapper.createComponents(AnalyzerWrapper.java:113) в org.analysis.Analyzer.tokenStream(Analyzer.java:144) в org.hibernate.search.query.dsl.impl.Helper.getAllTermsFromText(Helper.java:74) в org.hibernate.search.query.dsl.impl.ConnectedMultiFieldsBilder.getAllTermsFromText(ConnectedMultiFieldsTermQueryBuilder.java:172) в org.hibernate.search.query.dsl.impl.ConnectedMultiFieldsTermQueryBuilder.createQuery(ConnectedMultiFieldsTermQueryBuilder.java:89) в org.hibernate.search.query.dsl.impl.ConnectedMultiFieldsTermQueryreerQQuderTuderFuder
После ошибки во втором приложении я все еще могу хорошо искать в первом. Кажется, что проблема возникает, когда tomcat загружает необходимые классы для приложения, к которому я во второй раз обращался к поиску.
Все, что я обнаружил в stackru и в Интернете, говорит об ошибках компоновки, вызванных загрузкой веб-приложением одних и тех же классов из разных библиотек или необходимыми классами, скомпилированными с разными версиями Java. Но в этом случае это два разных приложения, что странно, и они оба работают до тех пор, пока вы не воспользуетесь поиском во втором приложении после его использования в первом приложении после чистого запуска tomcat. Самая близкая связанная проблема, которую я мог найти, была это для проекта под названием ясность.
Я всю ночь стучал головой о стену и не могу понять, что это может быть и где еще посмотреть.
1 ответ
После некоторой отладки в свете дня я решил обновить jdk, чтобы быть на 100% уверенным в openjdk 1.7u79 (от 1.7_05). Это, похоже, решило проблему. Lucene говорит использовать как минимум обновление 55, так как ниже этого есть некоторые ошибки JVM (до недавнего времени я использовал более раннюю версию lucene). Я не стал автоматически пытаться сделать это из-за странного случая, когда мне понадобилось второе приложение, чтобы вызвать ошибку.