WebSphere 8.5.5.13部署Jersey 1.19应用遇LinkageError求助
WebSphere 8.5.5.13部署Jersey 1.19应用时的LinkageError问题
环境与配置
- 运行环境:Java 8 + WebSphere 8.5.5.13
- 使用的Jersey jar包:
- jersey-bundle-1.19.1.jar
- jersey-core-1.19.jar
- jersey-json-1.19.4.jar
- jersey-server-1.19.jar
- 已添加的JVM属性:
com.ibm.websphere.jaxrs.server.DisableIBMJAXRSEngine = true - 应用类加载器设置:
parent_last
问题现象
应用启动正常,但访问任意REST方法时抛出如下异常:
com.ibm.ws.webcontainer.servlet.ServletWrapper service Uncaught service() exception thrown by servlet Jersey REST Service: java.lang.LinkageError: loading constraint violation when resolving method "org/codehaus/jackson/jaxrs/JacksonJsonProvider.isWriteable(Ljava/lang/Class;Ljava/lang/reflect/Type;[Ljava/lang/annotation/Annotation;Ljavax/ws/rs/core/MediaType;)Z" : loader "com/ibm/ws/classloader/CompoundClassLoader@5d1f2124" of class "com/sun/jersey/json/impl/provider/entity/JacksonProviderProxy" and loader "org/eclipse/osgi/internal/baseadaptor/DefaultClassLoader@6115f138" of class "org/codehaus/jackson/jaxrs/JacksonJsonProvider" have different types for the method signature at com.sun.jersey.json.impl.provider.entity.JacksonProviderProxy.isWriteable(JacksonProviderProxy.java:146) at com.sun.jersey.core.spi.factory.MessageBodyFactory._getMessageBodyWriter(MessageBodyFactory.java:395) at com.sun.jersey.core.spi.factory.MessageBodyFactory._getMessageBodyWriter(MessageBodyFactory.java:382) at com.sun.jersey.core.spi.factory.MessageBodyFactory.getMessageBodyWriter(MessageBodyFactory.java:363) at com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:267) at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1510) at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1419) at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1409) at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:409) at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:558) at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:733) at javax.servlet.http.HttpServlet.service(HttpServlet.java:668) at com.ibm.ws.cache.servlet.ServletWrapper.serviceProxied(ServletWrapper.java:307) at com.ibm.ws.cache.servlet.CacheHook.handleFragment(CacheHook.java:562) at com.ibm.ws.cache.servlet.CacheHook.handleServlet(CacheHook.java:255) at com.ibm.ws.cache.servlet.ServletWrapper.service(ServletWrapper.java:259) at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1233) at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:782) at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:481) at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:178) at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1114) at com.ibm.ws.webcontainer.webapp.WebApp.handleRequest(WebApp.java:4028) at com.ibm.ws.webcontainer.webapp.WebGroup.handleRequest(WebGroup.java:304) at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:1016) at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1817) at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:200) at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:463) at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:530) at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:316) at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.ready(HttpInboundLink.java:287) at com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.sendToDiscriminators(NewConnectionInitialReadCallback.java:214) at com.ibm.ws.tcp.channel.impl.NewConnectionInitialReadCallback.complete(NewConnectionInitialReadCallback.java:113) at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:175) at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217) at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161) at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138) at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204) at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775) at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:905) at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1892)
问题原因
该LinkageError由Jackson类的类加载冲突导致:
- 所使用的Jersey组件版本不统一(如jersey-bundle-1.19.1与jersey-json-1.19.4混合),引发依赖的Jackson类版本不一致。
- WebSphere的OSGI类加载器与应用自身的复合类加载器分别加载了Jackson相关类,导致同一方法的签名类型不匹配。
解决步骤
1. 统一Jersey组件版本
将所有Jersey相关jar包替换为同一版本(推荐1.19.1,避免跨版本依赖冲突):
- jersey-bundle-1.19.1.jar
- jersey-core-1.19.1.jar
- jersey-json-1.19.1.jar
- jersey-server-1.19.1.jar
2. 排除WebSphere自带的Jackson依赖
在应用的web.xml中添加类加载过滤规则,强制WebSphere使用应用自带的Jackson类:
<web-app> <!-- 其他原有配置 --> <context-param> <param-name>com.ibm.ws.webcontainer.allowDuplicateResources</param-name> <param-value>true</param-value> </context-param> <class-loader delegation="parentLast"> <common-library> <fileset dir="WEB-INF/lib" includes="*.jar"/> </common-library> <exclusion id="JacksonExclusion"> <filter>org.codehaus.jackson.*</filter> <filter>com.fasterxml.jackson.*</filter> </exclusion> </class-loader> </web-app>
3. 清理重复的Jackson jar
检查WEB-INF/lib目录,移除重复的Jackson相关jar包(例如jersey-bundle已包含部分Jackson类,无需额外添加单独的jackson-jaxrs.jar)。
4. 验证JVM属性与重启
确认com.ibm.websphere.jaxrs.server.DisableIBMJAXRSEngine=true已正确添加到JVM参数中,重启WebSphere使其生效。
5. 清理WebSphere缓存
- 删除WebSphere临时缓存目录(默认路径:
[WAS_HOME]/profiles/[PROFILE_NAME]/temp) - 清理应用缓存后重新部署应用
内容的提问来源于stack exchange,提问作者Mahmoud Saleh
相关产品推荐
相关产品推荐

