从 JBoss 7 EAP 中排除提供的 jackson 版本
Posted
技术标签:
【中文标题】从 JBoss 7 EAP 中排除提供的 jackson 版本【英文标题】:Exclude provided jackson version from JBoss 7 EAP 【发布时间】:2016-12-08 01:03:21 【问题描述】:我正在尝试使用 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 来自本地模块的“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,但对我没有帮助。
我错过了什么?
【问题讨论】:
您的部署是 EAR 吗? 您需要小心执行此操作,因为其他 Jackson 模块依赖于该模块。您是否有理由需要更新版本? Apache Camel 需要它。 【参考方案1】:我遇到了与 Jackson 完全相同的问题,我使用 jboss-deployment-structure.xml
让它在我的 EAP 7 中工作:
<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>
看起来只要任何 other 模块在其各自的module.xml
中将 jackson 列为它们的依赖项,它就不会被排除在外,而且 EAP 甚至不能被抛弃关于它的警告。
2018 年 2 月 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>
【讨论】:
我按照建议做了同样的事情,但我仍然收到Caused by: org.jboss.modules.ModuleLoadError: com.fasterxml.jackson.datatype.jackson-datatype-jdk8
的错误,我正在使用 wildfly 14 并使用 keycloak 创建一个问题。 Java 11 和 Spring 4.3.12。
它解决了我的问题,我从部署中排除,而不是从子部署中排除。谢谢。
hmmm 仍然收到上述is not assignable to
错误。我确实在我的 gradle 构建脚本中明确包含了 jackson-datatype-jdk8
和 jackson-datatype-jsr310
。不确定这是否会有所不同。
是的,就我而言,我正在部署启用了 spring jdbc 和 jpa 的 spring boot。这解决了我的问题。【参考方案2】:
看起来 jboss eap 7 中的 jax-rs 子模块使用了 jackson。一旦你跳过这个子模块,你就会摆脱 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 时才有意义 ;-)
【讨论】:
好吧,我们做到了。只是我们也明确地使用了 Jackson。 :-/ 我对 Json 的反序列化有问题,“出于安全原因而被阻止”并且 J 试图排除导致该异常的库 Jackson-mapper-asl,这也是 jaxrs 的一部分吗? 我在将 jboss 从 6.2 升级到 7.3 后遇到了问题:***.com/questions/68781412/… 这个答案解决了我的问题。非常感谢。以上是关于从 JBoss 7 EAP 中排除提供的 jackson 版本的主要内容,如果未能解决你的问题,请参考以下文章
JBoss EAP 7.1 部署失败的集成器:未找到提供程序
Jboss (6.4 EAP) 到 WebSphere (7.x)
从 JBoss AS 7.1 迁移到 JBoss EAP 7.3.0