Исключить предоставленную версию Джексона из JBoss 7 EAP

Я пытаюсь использовать более новую версию Jackson, которую предоставляет JBoss 7 EAP. Чтобы решить свою проблему, я создал файл jboss-deployment-structure.xml, который содержится в моем военном развертывании.

<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
    <deployment>
        <exclusions>
            <!--<module name="com.fasterxml.jackson.core.jackson-core" slot="main" />-->
            <!--<module name="com.fasterxml.jackson.core.jackson-annotations" slot="main" />-->
            <module name="com.fasterxml.jackson.core.jackson-databind" slot="main" />
        </exclusions>
    </deployment>
</jboss-deployment-structure>

Но похоже, что JBoss использует доставленный модуль вместо предоставленной зависимости.

ModuleClassLoader для модуля com.fasterxml.jackson.core.jackson-databind: main из локального загрузчика модуля @ 134593bf (искатель: локальный модуль поиска @ 4bb4de6a (корни: ... \ jboss-eap-7.0 \ modules, ... \ jboss-eap-7.0 \ модули \ система \ слои \ база))

Я нашел похожий вопрос JBoss 7 Classloader - Exclude Module Implementation, но мне это не помогло.

Что я пропустил?


person CSchulz    schedule 02.08.2016    source источник
comment
ваше развертывание - EAR?   -  person Tomaz Cerar    schedule 03.08.2016
comment
Будьте осторожны, делая это, поскольку другие модули Джексона зависят от этого модуля. По какой причине вам нужна более новая версия?   -  person James R. Perkins    schedule 03.08.2016
comment
Он нам нужен для Apache Camel.   -  person CSchulz    schedule 04.08.2016


Ответы (2)


Я столкнулся с той же проблемой с Джексоном, и я заставил ее работать в моем EAP 7, используя этот jboss-deployment-structure.xml:

<jboss-deployment-structure>
    <deployment>
        <exclusions>
            <module name="com.fasterxml.jackson.core.jackson-core" />
            <module name="com.fasterxml.jackson.core.jackson-annotations" />
            <module name="com.fasterxml.jackson.core.jackson-databind" />
            <module name="com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider" />
            <module name="org.jboss.resteasy.resteasy-jackson2-provider" />
            <module name="org.jboss.resteasy.resteasy-jackson-provider" />
        </exclusions>
    </deployment>
</jboss-deployment-structure>

Похоже, что до тех пор, пока любые другие модули перечисляют jackson в качестве их зависимости в своих соответствующих module.xml, он просто не исключается, и EAP не может даже выдать предупреждение об этом.

Изменить 2018-02-19: при обновлении EAP 7.0.0 до 7.1.0 все снова сломалось из-за обновленных jar-файлов Джексона.

Это важная часть трассировки стека:

Caused by: javax.ejb.EJBException: WFLYEJB0442: Unexpected Error
    at org.jboss.as.ejb3.tx.CMTTxInterceptor.handleExceptionInOurTx(CMTTxInterceptor.java:185)
[...]
    at org.jboss.as.ee.component.BasicComponent.constructComponentInstance(BasicComponent.java:161) [wildfly-ee-7.1.0.GA-redhat-11.jar:7.1.0.GA-redhat-11]
    ... 11 more
Caused by: java.lang.VerifyError: Bad type on operand stack
Exception Details:
  Location:
    [...]()Lcom/fasterxml/jackson/databind/ObjectMapper; @89: invokevirtual
  Reason:
    Type 'com/fasterxml/jackson/datatype/jdk8/Jdk8Module' (current frame, stack[1]) is not assignable to 'com/fasterxml/jackson/databind/Module'

Итак, мы исключаем и их:

<jboss-deployment-structure>
    <deployment>
        <exclusions>
            <module name="com.fasterxml.jackson.core.jackson-core" />
            <module name="com.fasterxml.jackson.core.jackson-annotations" />
            <module name="com.fasterxml.jackson.core.jackson-databind" />
            <module name="com.fasterxml.jackson.datatype.jackson-datatype-jdk8" />
            <module name="com.fasterxml.jackson.datatype.jackson-datatype-jsr310" />
            <module name="com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider" />
            <module name="org.jboss.resteasy.resteasy-jackson2-provider" />
            <module name="org.jboss.resteasy.resteasy-jackson-provider" />
        </exclusions>
    </deployment>
</jboss-deployment-structure>
person Antares42    schedule 25.02.2017
comment
Я сделал то же самое, но все равно получил ошибку Caused by: org.jboss.modules.ModuleLoadError: com.fasterxml.jackson.datatype.jackson-datatype-jdk8, я использую wildfly 14 и при работе с keycloak возникает проблема. Java 11 и Spring 4.3.12. - person minu; 25.02.2019
comment
Это решает мою проблему, я исключал из развертывания, а не из подразвертывания. Спасибо. - person minu; 25.02.2019
comment
хммм по-прежнему получаю is not assignable to ошибки, упомянутые выше. Я явно включаю jackson-datatype-jdk8 и jackson-datatype-jsr310 в свой скрипт сборки gradle. Не уверен, что это отличает его. - person Drew13; 19.11.2019
comment
да, в моем случае я развертывал весеннюю загрузку с включенными Spring jdbc и jpa. это решает мои проблемы. - person Nicholas DiPiazza; 22.12.2020

Похоже, что подмодуль jax-rs из jboss eap 7 использует Джексона. Как только вы пропустите этот подмодуль, вы избавитесь от версии jboss jackson:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
    <deployment>
        <exclude-subsystems>
            <subsystem name="jaxrs"/>
        </exclude-subsystems>
    </deployment>
</jboss-deployment-structure>

(имеет смысл только в том случае, если вы не используете jaxrs ;-)

person Dudelilama    schedule 25.08.2017
comment
Что ж, делаем. Просто мы также явно используем Джексона. : - / - person Antares42; 26.09.2017
comment
У меня проблема с десериализацией Json, «предотвращенная по соображениям безопасности». И я пытаюсь исключить библиотеку, ответственную за это исключение, Jackson-mapper-asl, это тоже часть jaxrs? - person Bionix1441; 01.12.2020