将 *.ear 部署到 JBoss 时,它总是使用错误版本的 com.fasterxml.jackson.core
。
我的代码使用 com.fasterxml.jackson.core 版本 2.9.0 的功能并且编译正常,但是在 JBoss 中调用代码时,我得到了 java.lang.NoSuchFieldError
。
在我看来,JBoss 类加载器使用已安装的 jackson 模块版本 2.5.0。
如何让 JBoss 类加载器在我的部署中使用版本 2.9.0?
情况
我正在为 Keycloak 开发一个插件,我通过 Keycloak Docker Image 部署它在本地进行测试版本3.2.1。
在启动镜像之前,通过将耳朵复制到 $JBOSS_HOME/standalone/deployments 来部署耳朵,并且该插件工作正常,直到我使用 jackson 2.9 中的函数。
到目前为止我已经尝试过:
我通过 pom.xml 固定了版本:
<dependencyManagement>
<dependencies>
<dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
</dependencyManagement>
我在 jboss-deployment-struct.xml 中排除了 jackson-modules:
<deployment>
<dependencies>
<module name="org.keycloak.keycloak-core" export="true" />
<module name="org.keycloak.keycloak-server-spi" export="true" />
<module name="org.keycloak.keycloak-server-spi-private" export="true" />
<module name="org.keycloak.keycloak-services" export="true" />
<module name="org.bouncycastle" export="true" />
<module name="com.google.guava" export="true" />
<module name="org.jboss.logging" export="true" />
</dependencies>
<exclusions>
<module name="com.fasterxml.jackson.core.jackson-core" />
<module name="com.fasterxml.jackson.core.jackson-databind" />
<module name="com.fasterxml.jackson.core.jackson-annotations" />
</exclusions>
</deployment>
我检查了依赖关系树:
mvn dependency:tree | grep jackson
[INFO] | +- com.fasterxml.jackson.core:jackson-core:jar:2.9.0:compile
[INFO] | \- com.fasterxml.jackson.core:jackson-databind:jar:2.9.0:compile
[INFO] | +- com.fasterxml.jackson.core:jackson-annotations:jar:2.9.0:compile
[INFO] \- com.github.kittinunf.fuel:fuel-jackson:jar:1.12.0:runtime
[INFO] +- com.fasterxml.jackson.module:jackson-module-kotlin:jar:2.9.0:runtime
[INFO] | +- com.fasterxml.jackson.core:jackson-core:jar:2.9.0:compile
[INFO] | \- com.fasterxml.jackson.core:jackson-databind:jar:2.9.0:compile
[INFO] | \- com.fasterxml.jackson.core:jackson-annotations:jar:2.9.0:compile
[INFO] \- com.github.kittinunf.fuel:fuel-jackson:jar:1.12.0:runtime
[INFO] +- com.fasterxml.jackson.module:jackson-module-kotlin:jar:2.9.0:runtime
Jackson 2.5 库已预先安装,因为 Keycloak 依赖于它:
find ${JBOSS_HOME}/modules | grep jackson-core
/opt/jboss/keycloak/modules/system/layers/base/com/fasterxml/jackson/core/jackson-core
/opt/jboss/keycloak/modules/system/layers/base/com/fasterxml/jackson/core/jackson-core/main
/opt/jboss/keycloak/modules/system/layers/base/com/fasterxml/jackson/core/jackson-core/main/module.xml
/opt/jboss/keycloak/modules/system/layers/base/com/fasterxml/jackson/core/jackson-core/main/jackson-core-2.5.4.jar
当我解压我的 *.ear 包时,我在 libs/
中找到了具有正确版本的 jackson-jars (META-INF/MANIFEST.MF
表示 Bundle-Version: 2.9.0
:
ls lib | grep jackson
jackson-annotations.jar
jackson-core.jar
jackson-databind.jar
谁能向我解释一下,我是否以及如何让 JBoss 使用正确版本的 jackson?
谢谢!
最佳答案
尝试将以下模块添加到 <exclusions>
.
<module name="org.jboss.resteasy.resteasy-jackson2-provider" />
<module name="com.fasterxml.jackson.module.jackson-module-jaxb-annotations" />
<module name="com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider" />
<module name="com.fasterxml.jackson.jaxrs.jackson-jaxrs-base" />
关于java - 如何强制 JBoss 部署使用特定版本的依赖项而不是已安装的模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50746371/