Spring boot jackson auto configuration linkage error wildfly
Spring boot jackson auto configuration linkage error wildfly
A.war -> 是一个使用版本 1.2.6.RELEASE 的简单 spring 引导 REST 应用程序(内部使用 spring 4.1.7 RELEASE,jackson 2.4.6)
B.jar -> 是一个wildfly9共享模块(存储在wildfly/modules中),使用包含spring框架的maven shaded插件打包(没有spring引导意味着使用添加 spring 项目依赖项的旧方法)和与上面相同版本的 jackson classes。 (它有阴影是因为非 spring 和非容器项目可以将这个 jar 添加到他们的 class-path 并使用它 - 它有效)
A.war 具有 Maven 依赖性 scope <provided> on B.jar
并且具有 jboss-deployment-structure.xml 和 <dependencies> <module name = "B"> </dependencies>
A.war 部署失败并出现以下错误。
注意:当我删除 B.jar jboss 依赖项时,A.war 部署得非常好。所以添加 B.jar 导致了这个问题。如果我不在 A.war 中使用 spring 引导(意思是如果我直接使用简单的 spring webmvc 和上下文依赖)和 B.jar jboss 依赖,A.war 部署也很完美
任何人都可以向我解释下面的错误是什么,我该如何调查更多?
据我对 wildlfy classloading 的理解,A.war 和 B.jar 应该在不同的模块 class 加载器中加载,A.war 是不是在抱怨关于 jackson classes of B.jar 这里的错误?
Caused by: java.lang.LinkageError: loader constraint violation: when resolving method
"org.springframework.http.converter.json.Jackson2ObjectMapperBuilder.modulesToInstall([Lcom/fasterxml/jackson/databind/Module;)Lorg/springframework/http/converter/json/Jackson2ObjectMapperBuilder;"
the class loader (instance of org/jboss/modules/ModuleClassLoader) of the current class,
org/springframework/boot/autoconfigure/jackson/JacksonAutoConfiguration$JacksonObjectMapperBuilderConfiguration,
and the class loader (instance of org/jboss/modules/ModuleClassLoader) for resolved class,
org/springframework/http/converter/json/Jackson2ObjectMapperBuilder,
have different Class objects for the type der used in the signature
at org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration$JacksonObjectMapperBuilderConfiguration.configureModules(JacksonAutoConfiguration.java:259)
at org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration$JacksonObjectMapperBuilderConfiguration.jacksonObjectMapperBuilder(JacksonAutoConfiguration.java:186)
at org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration$JacksonObjectMapperBuilderConfiguration$$EnhancerBySpringCGLIB$$b993caa0.CGLIB$jacksonObjectMapperBuilder()
at org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration$JacksonObjectMapperBuilderConfiguration$$EnhancerBySpringCGLIB$$b993caa0$$FastClassBySpringCGLIB$62bf2.invoke()
at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228)
at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:318)
at org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration$JacksonObjectMapperBuilderConfiguration$$EnhancerBySpringCGLIB$$b993caa0.jacksonObjectMapperBuilder()
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162) ... 108 more
在调查更多 jboss 类加载行为后,B.jar 中的 jackson 类 与 jboss restesay 模块中的相同 jackson 类 发生冲突。
所以在 jboss-deployment-structure.xml 中排除它们之后,这个问题就解决了..
<exclusions>
<module name="org.jboss.resteasy.resteasy-jackson-provider"/>
<module name="org.jboss.resteasy.resteasy-jackson2-provider"/>
</exclusions>
A.war -> 是一个使用版本 1.2.6.RELEASE 的简单 spring 引导 REST 应用程序(内部使用 spring 4.1.7 RELEASE,jackson 2.4.6)
B.jar -> 是一个wildfly9共享模块(存储在wildfly/modules中),使用包含spring框架的maven shaded插件打包(没有spring引导意味着使用添加 spring 项目依赖项的旧方法)和与上面相同版本的 jackson classes。 (它有阴影是因为非 spring 和非容器项目可以将这个 jar 添加到他们的 class-path 并使用它 - 它有效)
A.war 具有 Maven 依赖性 scope <provided> on B.jar
并且具有 jboss-deployment-structure.xml 和 <dependencies> <module name = "B"> </dependencies>
A.war 部署失败并出现以下错误。
注意:当我删除 B.jar jboss 依赖项时,A.war 部署得非常好。所以添加 B.jar 导致了这个问题。如果我不在 A.war 中使用 spring 引导(意思是如果我直接使用简单的 spring webmvc 和上下文依赖)和 B.jar jboss 依赖,A.war 部署也很完美
任何人都可以向我解释下面的错误是什么,我该如何调查更多?
据我对 wildlfy classloading 的理解,A.war 和 B.jar 应该在不同的模块 class 加载器中加载,A.war 是不是在抱怨关于 jackson classes of B.jar 这里的错误?
Caused by: java.lang.LinkageError: loader constraint violation: when resolving method
"org.springframework.http.converter.json.Jackson2ObjectMapperBuilder.modulesToInstall([Lcom/fasterxml/jackson/databind/Module;)Lorg/springframework/http/converter/json/Jackson2ObjectMapperBuilder;"
the class loader (instance of org/jboss/modules/ModuleClassLoader) of the current class,
org/springframework/boot/autoconfigure/jackson/JacksonAutoConfiguration$JacksonObjectMapperBuilderConfiguration,
and the class loader (instance of org/jboss/modules/ModuleClassLoader) for resolved class,
org/springframework/http/converter/json/Jackson2ObjectMapperBuilder,
have different Class objects for the type der used in the signature
at org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration$JacksonObjectMapperBuilderConfiguration.configureModules(JacksonAutoConfiguration.java:259)
at org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration$JacksonObjectMapperBuilderConfiguration.jacksonObjectMapperBuilder(JacksonAutoConfiguration.java:186)
at org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration$JacksonObjectMapperBuilderConfiguration$$EnhancerBySpringCGLIB$$b993caa0.CGLIB$jacksonObjectMapperBuilder()
at org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration$JacksonObjectMapperBuilderConfiguration$$EnhancerBySpringCGLIB$$b993caa0$$FastClassBySpringCGLIB$62bf2.invoke()
at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228)
at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:318)
at org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration$JacksonObjectMapperBuilderConfiguration$$EnhancerBySpringCGLIB$$b993caa0.jacksonObjectMapperBuilder()
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162) ... 108 more
在调查更多 jboss 类加载行为后,B.jar 中的 jackson 类 与 jboss restesay 模块中的相同 jackson 类 发生冲突。 所以在 jboss-deployment-structure.xml 中排除它们之后,这个问题就解决了..
<exclusions>
<module name="org.jboss.resteasy.resteasy-jackson-provider"/>
<module name="org.jboss.resteasy.resteasy-jackson2-provider"/>
</exclusions>