Liberty 21.0.0.6部署JAX-RS应用出现init()类转换异常求助
问题描述
基于JAX-RS开发的Web服务应用,部署到Linux环境的Liberty 21.0.0.6运行时触发初始化异常,但在本地Windows端同版本Liberty中运行正常无报错,公开渠道可查的解决方案均未生效,具体错误信息和配置如下:
异常日志
E SRVE0271E: Uncaught init() exception created by servlet [JAX-RS Servlet] in application [ABC_WSv2.1]: java.lang.ClassCastException: com.abc.occws.SearchingApplication incompatible with javax.ws.rs.core.Application
server.xml配置
<?xml version="1.0" encoding="UTF-8"?> <server description="new server"> <!-- Enable features --> <featureManager> <feature>webProfile-8.0</feature> </featureManager> <!-- To access this server from a remote client add a host attribute to the following element, e.g. host="*" --> <httpEndpoint httpPort="9080" httpsPort="9443" id="defaultHttpEndpoint" /> <dataSource id="ABCDataSource" jndiName="jdbc/ABCDS" queryTimeout="20m" type="javax.sql.DataSource"> <connectionManager agedTimeout="1000m" minPoolSize="1" numConnectionsPerThreadLocal="10"/> <jdbcDriver libraryRef="OracleLib"/> <properties.oracle URL="jdbc:oracle:thin:@//10.135.157.5:1565/DOABC_APP" password="xxx" user="xxxx"/> </dataSource> <!-- Define JDBC Drivers --> <library id="OracleLib"> <file name="C:/dev/Liberty/ojdbc8-19.3.0.0.jar"/> </library> <applicationMonitor updateTrigger="mbean" /> <application id="ABC_WSv2.1" location="C:\Dev\Liberty\ABC_WSv2.1.ear" name="ABC_WSv2.1" type="ear" context-root="/abc-ws"> <classloader commonLibraryRef="OracleLib"/> </application> <webContainer uppressHtmlRecursiveErrorOutput="true"/> </server>
排查思路与解决方案
- 优先排查应用包内依赖冲突:
webProfile-8.0特性已经内置了JAX-RS 2.1实现以及javax.ws.rs相关API包,如果你的EAR/WAR包内也打包了javax.ws.rs-api、jersey、resteasy等JAX-RS相关依赖,会导致两个不同类加载器加载的javax.ws.rs.core.Application类实例出现类型不兼容问题。Windows环境运行正常是因为不同操作系统下Liberty的类加载顺序存在差异,优先加载了容器内置的API类,没有触发冲突。
解决方法:将应用打包配置中JAX-RS相关的API、实现依赖的scope改为provided,打包时排除这些依赖,统一使用Liberty容器提供的版本。 - 修正Linux环境下的路径配置:你提供的server.xml中用的是Windows格式的路径,部署到Linux时需要将Oracle库路径、EAR包路径替换为Linux下的实际绝对路径,路径加载错误会引发连锁类加载异常。
- 显式指定JAX-RS特性:可以在
featureManager节点下额外添加jaxrs-2.1特性,避免webProfile特性加载不全的问题:<featureManager> <feature>webProfile-8.0</feature> <feature>jaxrs-2.1</feature> </featureManager> - 调整类加载优先级:如果确认不能排除应用内的JAX-RS依赖,可以在application节点的classloader配置中添加
parentLast="true"属性,让应用类加载器优先加载自身包里的类:<application id="ABC_WSv2.1" location="Linux环境下EAR包的实际路径" name="ABC_WSv2.1" type="ear" context-root="/abc-ws"> <classloader commonLibraryRef="OracleLib" parentLast="true"/> </application> - 核对类继承关系:确认
SearchingApplication类确实直接或间接继承了javax.ws.rs.core.Application,没有误引入jakarta.ws.rs包下的同名类导致类型不匹配。
内容的提问来源于stack exchange,提问作者Ambar Majumdar
相关产品推荐
相关产品推荐

