如何在 JBoss EAP 7.1 中排除 jackson 库而不排除 resteasy

How to exclude jackson library without excluding resteasy in JBoss EAP 7.1

我想在 JBOSS 中使用我的自定义 Jackson 版本。为此,我想排除本机 jboss jackson 库并将我的版本添加为 gradle 依赖项。 我也在项目中使用了 resteasy,不想排除 jax-rs 模块。 可能吗? 已尝试配置

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.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" />

            <module name="com.fasterxml.jackson.core.databind"/>
        </exclusions>
    </deployment>
</jboss-deployment-structure>

objectMapper.getClass().getPackage().getImplementationVersion()

总是 terurns

2.8.9.redhat-1

问题是 jackson 库是 org.jboss.resteasy.resteasy-jackson2-provider 模块的依赖项。并且该模块是使用 JAX-RS 注释的任何 WAR EAR 子部署的自动依赖项(请参阅 Table 3.1。Redhat 7.2 开发指南的隐式模块依赖项)。

您需要使用 JAX-RS 在 WAR 的子部署级别排除 resteasy-jackson2-provider 模块,并重新定义它以排除所有 jackson 依赖项。您可以在类似情况下看到这种方法(自动依赖项包含的模块)https://developer.jboss.org/thread/175075

我已经在 JBoss 7.2.6

上测试过了
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">

    <sub-deployment name="myrestmodule.war">
        <dependencies>
            <module name="deployment.org.jboss.resteasy.resteasy-jackson2-provider" />
        </dependencies>
        <exclusions>
            <module name="org.jboss.resteasy.resteasy-jackson2-provider" />
        </exclusions>
    </sub-deployment>

    <module name="deployment.org.jboss.resteasy.resteasy-jackson2-provider">
        <dependencies>
            <module name="org.jboss.resteasy.resteasy-jackson2-provider" export="true">
                <imports>
                    <exclude path="com/fasterxml/jackson/**" />
                </imports>
            </module>
        </dependencies>
    </module>

</jboss-deployment-structure>

所需的 jackson 库必须包含在 myrestmodule.war WEB-INF/lib 文件夹中。

已更新

如果在 EAR 的其他库中使用 jackson 而不仅仅是在使用 JAX-RS 的 WAR 上,则此方法不起作用。例如,如果在WAR上使用了EAR库目录下JAR中的一个bean,jackson将无法识别其中的注解。

要使此部署生效,需要在 EAR 部署级别排除 "org.jboss.resteasy.resteasy-jackson2-provider" 模块,并且需要将 jackson 库包含在 EAR 的库目录中,而不是 WEB-INF/lib 的 WAR.

这将是 EAR 的 META-INF 目录中更新的 jboss-deployment-structure.xml:

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
    <deployment>
        <dependencies>
            <module name="deployment.org.jboss.resteasy.resteasy-jackson2-provider" />
        </dependencies>
        <exclusions>
            <module name="org.jboss.resteasy.resteasy-jackson2-provider" />
        </exclusions>
    </deployment>

    <sub-deployment name="myrestmodule.war">
        <dependencies>
            <module name="deployment.org.jboss.resteasy.resteasy-jackson2-provider" />
        </dependencies>
        <exclusions>
            <module name="org.jboss.resteasy.resteasy-jackson2-provider" />
        </exclusions>
    </sub-deployment>

    <module name="deployment.org.jboss.resteasy.resteasy-jackson2-provider">
        <dependencies>
            <module name="org.jboss.resteasy.resteasy-jackson2-provider" export="true">
                <imports>
                    <exclude path="com/fasterxml/jackson/**" />
                </imports>
            </module>
        </dependencies>
    </module>
</jboss-deployment-structure>