OMLinkedListMetaFactory ClassCastException в проекте Tomcat на сервере OpenSuse, но не локально
Я работаю с двумя проектами: один — веб-сервис, а другой — бизнес-логика. Проект веб-сервиса зависит от проекта бизнес-логики.
Для запуска проекта я использую Tomcat 9.0.65 и Java 11 с Maven для управления зависимостями.
Когда я запускаю проект в своей локальной среде, все работает правильно. Но когда я создаю файл .war и развертываю его на сервере под управлением OpenSuse 12, я сталкиваюсь со следующей ошибкой:
javax.servlet.ServletException: javax.servlet.ServletException: java.lang.ClassCastException: class org.apache.axiom.om.impl.llom.factory.OMLinkedListMetaFactory cannot be cast to class org.apache.axiom.om.OMMetaFactorySPI (org.apache.axiom.om.impl.llom.factory.OMLinkedListMetaFactory and org.apache.axiom.om.OMMetaFactorySPI are in unnamed module of loader org.apache.catalina.loader.ParallelWebappClassLoader @5b40ceb)
org.apache.axis2.transport.http.AxisServlet.init(AxisServlet.java:462)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:687)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360)
org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:890)
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1789)
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
java.base/java.lang.Thread.run(Thread.java:834)
causa raíz
javax.servlet.ServletException: java.lang.ClassCastException: class org.apache.axiom.om.impl.llom.factory.OMLinkedListMetaFactory cannot be cast to class org.apache.axiom.om.OMMetaFactorySPI (org.apache.axiom.om.impl.llom.factory.OMLinkedListMetaFactory and org.apache.axiom.om.OMMetaFactorySPI are in unnamed module of loader org.apache.catalina.loader.ParallelWebappClassLoader @5b40ceb)
org.apache.axis2.transport.http.AxisServlet.initConfigContext(AxisServlet.java:591)
org.apache.axis2.transport.http.AxisServlet.init(AxisServlet.java:454)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:687)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360)
org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:890)
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1789)
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
java.base/java.lang.Thread.run(Thread.java:834)
causa raíz
java.lang.ClassCastException: class org.apache.axiom.om.impl.llom.factory.OMLinkedListMetaFactory cannot be cast to class org.apache.axiom.om.OMMetaFactorySPI (org.apache.axiom.om.impl.llom.factory.OMLinkedListMetaFactory and org.apache.axiom.om.OMMetaFactorySPI are in unnamed module of loader org.apache.catalina.loader.ParallelWebappClassLoader @5b40ceb)
org.apache.axiom.om.OMXMLBuilderFactory.createOMBuilder(OMXMLBuilderFactory.java:165)
org.apache.axiom.om.OMXMLBuilderFactory.createOMBuilder(OMXMLBuilderFactory.java:145)
org.apache.axiom.om.OMXMLBuilderFactory.createOMBuilder(OMXMLBuilderFactory.java:116)
org.apache.axis2.util.XMLUtils.toOM(XMLUtils.java:590)
org.apache.axis2.util.XMLUtils.toOM(XMLUtils.java:575)
org.apache.axis2.deployment.DescriptionBuilder.buildOM(DescriptionBuilder.java:97)
org.apache.axis2.deployment.AxisConfigBuilder.populateConfig(AxisConfigBuilder.java:90)
org.apache.axis2.deployment.DeploymentEngine.populateAxisConfiguration(DeploymentEngine.java:857)
org.apache.axis2.deployment.WarBasedAxisConfigurator.<init>(WarBasedAxisConfigurator.java:156)
org.apache.axis2.transport.http.AxisServlet.initConfigContext(AxisServlet.java:584)
org.apache.axis2.transport.http.AxisServlet.init(AxisServlet.java:454)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:687)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360)
org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:890)
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1789)
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
java.base/java.lang.Thread.run(Thread.java:834)
Похоже, ошибка связана с классом Apache Axiom. Когда я проверяю библиотеки проекта, развернутые на сервере, то вижу, что библиотеки Axiom дублируются. Это связано с тем, что веб-сервис использует версию Axiom 1.2.13, а проект бизнес-логики — версию 1.4.0. Когда я вручную удаляю библиотеку 1.4.0, проект работает на сервере.
Я пытался исключить эту библиотеку из своей локальной среды, но при этом возникает много ошибок. Я также пробовал использовать одну и ту же версию Axiom (1.2.13 и 1.4.0) в обоих проектах, но она не работает в моей локальной среде из-за проблем несовместимости с версией apache-axis.
Может ли это быть проблемой в том, как Tomcat обрабатывает зависимости в Linux? Есть ли что-то еще, что я могу упустить из виду? Любые рекомендации будут очень признательны.
Заранее спасибо.
1 ответ
Наконец-то я смог решить свою проблему, на которую повлияли три ключевых фактора.
Версии Axis2 и Axiom: мне пришлось вернуться к более старым версиям axis2 и Axiom, чтобы избежать конфликтов. Версии, которые в конечном итоге сработали для меня, следующие:
<axiom.version>1.2.13</axiom.version> <axis2.version>1.6.2</axis2.version>
Порядок загрузки библиотек. Порядок загрузки библиотек в моем проекте также влиял на ситуацию. Обязательно проверьте и при необходимости откорректируйте это в своем проекте.
Несовместимость JDK 11: я также столкнулся с проблемой, когда
javax.xml.stream
был доступен более чем одному модулю. Чтобы это исправить, мне пришлось исключить из моих зависимостей следующие библиотеки:<dependency> <groupId>org.apache.ws.commons.axiom</groupId> <artifactId>axiom-api</artifactId> <version>${axiom.version}</version> <exclusions> <exclusion> <groupId>org.apache.james</groupId> <artifactId>apache-mime4j-core</artifactId> </exclusion> <exclusion> <groupId>org.apache.geronimo.specs</groupId> <artifactId> geronimo-activation_1.1_spec </artifactId> </exclusion> <exclusion> <groupId>org.apache.geronimo.specs</groupId> <artifactId>geronimo-stax-api_1.0_spec</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.ws.commons.axiom</groupId> <artifactId>axiom-impl</artifactId> <version>${axiom.version}</version> <exclusions> <exclusion> <groupId>org.apache.geronimo.specs</groupId> <artifactId> geronimo-activation_1.1_spec </artifactId> </exclusion> <exclusion> <groupId>org.apache.geronimo.specs</groupId> <artifactId>geronimo-stax-api_1.0_spec</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.ws.commons.axiom</groupId> <artifactId>axiom-dom</artifactId> <version>${axiom.version}</version> <exclusions> <exclusion> <groupId>org.apache.geronimo.specs</groupId> <artifactId> geronimo-activation_1.1_spec </artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.axis2</groupId> <artifactId>axis2-adb</artifactId> <version>${axis2.version}</version> <exclusions> <exclusion> <groupId>org.apache.geronimo.specs</groupId> <artifactId> geronimo-activation_1.1_spec </artifactId> </exclusion> </exclusions> </dependency>
Я надеюсь, что эта информация поможет кому-то еще, столкнувшемуся с похожей проблемой. Спасибо всем за оказанную помощь.