6

我正在尝试使用 JBoss 7 EAP 提供的更新版本的 Jackson。为了解决我的问题,我创建了一个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 for Module "com.fasterxml.jackson.core.jackson-databind:main" 来自本地模块加载器@134593bf(查找器:本地模块查找器@4bb4de6a(根:...\jboss-eap-7.0\modules,... \jboss-eap-7.0\modules\system\layers\base))

我发现了一个类似的问题JBoss 7 Classloader -- Exclude Module Implementation但它对我没有帮助。

我错过了什么?

4

2 回答 2

17

我遇到了与 Jackson 完全相同的问题,我使用它在我的 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 时,由于更新了 Jackson 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>
于 2017-02-25T21:27:28.967 回答
4

看起来 jboss eap 7 中的 jax-rs 子模块使用了杰克逊。一旦你跳过这个子模块,你就会摆脱 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 时才有意义;-)

于 2017-08-25T12:13:58.867 回答