Exclude provided jackson version from JBoss 7 EAP
Asked Answered
R

2

6

I am trying to use a newer version of Jackson as JBoss 7 EAP delivers. To solve my issue I have created a jboss-deployment-structure.xml file which is contained in my war deployment.

<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>

But it seems that JBoss uses the delivered module instead of the provided dependency.

ModuleClassLoader for Module "com.fasterxml.jackson.core.jackson-databind:main" from local module loader @134593bf (finder: local module finder @4bb4de6a (roots: ...\jboss-eap-7.0\modules,...\jboss-eap-7.0\modules\system\layers\base))

I have found a similar question JBoss 7 Classloader -- Exclude Module Implementation but it didn't help me.

What did I miss?

Rigatoni answered 2/8, 2016 at 15:18 Comment(3)
is your deployment an EAR?Hosfmann
You'll want to be careful doing this as other Jackson modules depend on that module. Is there a reason you need a newer version?Allman
We need it for Apache Camel.Rigatoni
B
19

I ran into the exact same problem with Jackson, and I got it to work in my EAP 7 using this 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>

It appears like as long as any other modules list jackson as their dependency in their respective module.xml, it just simply doesn't get excluded, and EAP can't be arsed to even throw a warning about it.

Edit 2018-02-19: When upgrading from EAP 7.0.0 to 7.1.0, things broke again, owing to updated Jackson jars.

This is the crucial part of the stacktrace:

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'

So we exclude those as well:

<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>
Bozcaada answered 25/2, 2017 at 21:27 Comment(4)
I did the same as suggested, but still I got error as Caused by: org.jboss.modules.ModuleLoadError: com.fasterxml.jackson.datatype.jackson-datatype-jdk8 , I am using wildfly 14 and working with keycloak create an issue. Java 11 and spring 4.3.12.Croquette
It resolves my problem, I was excluding from deployment , instead from sub-deployment. Thanks.Croquette
hmmm still getting the is not assignable to errors mentioned above. I do include jackson-datatype-jdk8 and jackson-datatype-jsr310 explicitly in my gradle build script. Not sure if that makes this different.Pilose
yeah in my case i was deploying spring boot with spring jdbc and jpa enabled. this fixes my issues.Jellaba
V
6

It looks like the jax-rs submodule from jboss eap 7 uses jackson. As soon as you skip this submodule, you will get rid of the jboss jackson version:

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

(only makes sense if you don't use jaxrs ;-)

Vitriol answered 25/8, 2017 at 12:13 Comment(3)
Well, we do. Just that we explicitly use Jackson as well. :-/Bozcaada
I have a problem with the deserialization of Json, “prevented for security reasons” And J am trying to exclude the library responsible for that exception, Jackson-mapper-asl, is that also part of jaxrs?Subsellium
I was facing issues after upgrading jboss from 6.2 to 7.3: #68781912 This answer has solved my issue. Thanks much.Escharotic

© 2022 - 2024 — McMap. All rights reserved.