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 ответ

Наконец-то я смог решить свою проблему, на которую повлияли три ключевых фактора.

  1. Версии Axis2 и Axiom: мне пришлось вернуться к более старым версиям axis2 и Axiom, чтобы избежать конфликтов. Версии, которые в конечном итоге сработали для меня, следующие:

            <axiom.version>1.2.13</axiom.version>
    <axis2.version>1.6.2</axis2.version>
    
  2. Порядок загрузки библиотек. Порядок загрузки библиотек в моем проекте также влиял на ситуацию. Обязательно проверьте и при необходимости откорректируйте это в своем проекте.

  3. Несовместимость 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>
    

Я надеюсь, что эта информация поможет кому-то еще, столкнувшемуся с похожей проблемой. Спасибо всем за оказанную помощь.

Другие вопросы по тегам