You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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类的类加载冲突导致:

  1. 所使用的Jersey组件版本不统一(如jersey-bundle-1.19.1与jersey-json-1.19.4混合),引发依赖的Jackson类版本不一致。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 10:35:21