java - 如何强制 JBoss 部署使用特定版本的依赖项而不是已安装的模块?

标签 java maven jboss keycloak

将 *.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/

相关文章:

java - 在android上拖放一个按钮..帮助

spring-boot - 无法对 spring 微服务多模块应用程序进行 dockerize

java - 如何使用 div 标签从下拉列表中选择元素

java - 使用 shiro wildfly jsf 和 primefaces 进行简单登录

Java 斐波那契数列

java - onItemSelectedListner 实现抽象方法

java - Spring AOP 切入点表达式排除特定的返回类型或参数

JavaFx Jar 文件不能在 linux 上运行(在 windows 上运行良好)

java - JVM/AS 监控工具

java - 使用InternalEntryFactory类将Infinispan 4.2迁移到5.1