JDK17启动Payara5时JDBC连接池ping失败报类找不到异常
JDK17环境下Payara5 JDBC连接池ClassNotFoundException问题
问题现象
JDK 8环境下Payara 5的Oracle JDBC连接池可正常工作,切换为JDK 17启动服务后,在管理控制台对连接池执行ping操作失败。
连接池配置如下:
<jdbc-connection-pool max-pool-size="100" datasource-classname="oracle.jdbc.pool.OracleDataSource" steady-pool-size="1" validation-table-name="dual" name="oracle_thin_emp" is-connection-validation-required="true" res-type="javax.sql.DataSource"> <property name="driverClass" value="oracle.jdbc.driver.OracleDriver"></property> <property name="URL" value="jdbc:oracle:thin:@192.168.50.19:1521:TD"></property> <property name="serverName" value="192.168.50.19"></property> <property name="User" value="EMP"></property> <property name="Password" value="EMP"></property> <property name="PortNumber" value="1521"></property> <property name="databaseName" value="TD"></property> </jdbc-connection-pool>
控制台返回错误:
Ping Connection Pool failed for oracle_thin_emp. Class name is wrong or classpath is not set for : oracle.jdbc.pool.OracleDataSource Please check the server.log for more details.
服务端日志关键报错:
[Payara 5.2022.2] [SEVERE] [] [javax.enterprise.resource.resourceadapter.com.sun.gjc.util] [tid: _ThreadID=163 _ThreadName=admin-thread-pool::admin-listener(4)] [timeMillis: 1657657513953] [levelValue: 1000] [[ RAR5099 : Wrong class name or classpath for Datasource Object java.lang.ClassNotFoundException: oracle.jdbc.pool.OracleDataSource at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:445) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:587) at com.sun.enterprise.loader.CurrentBeforeParentClassLoader.loadClass(CurrentBeforeParentClassLoader.java:83) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520) at java.base/java.lang.Class.forName0(Native Method) at java.base/java.lang.Class.forName(Class.java:467)
当前运行环境:
- JDK:Oracle JDK 17.0.3.1
- 应用服务器:Payara 5.2022.2
- JDBC驱动存放路径:
payara5\glassfish\domains\domain1\lib\ext\ojdbc7-12.1.0.2.jar
问题根因
- JDK 9开始废弃并逐步移除了扩展类加载(Extension ClassLoader)机制,原
lib/ext目录下的Jar包不会被JDK默认类加载器扫描,JDK 17环境下放在该目录的JDBC驱动无法被Payara加载,直接触发类找不到错误。 - 当前使用的ojdbc7 12.1.0.2是适配JDK 7、JDK 8的旧版本驱动,未适配JDK 9+引入的模块化系统,存在内部API访问限制、类加载逻辑不兼容的问题,本身就无法在JDK 17环境下正常运行。
解决方案
- 替换JDBC驱动版本:将ojdbc7替换为适配JDK 17的版本,推荐使用ojdbc11(Oracle官方针对JDK 11及以上版本的兼容驱动,可稳定运行在JDK 17环境),最低要求使用ojdbc8的19c及以上更新版本。
- 调整驱动存放路径:不要将驱动放在
lib/ext目录下,迁移至域全局类库目录payara5/glassfish/domains/domain1/lib,该目录下的Jar包会被Payara的公共类加载器正常扫描加载。 - 按需添加JVM启动参数:如果替换驱动、调整路径后仍存在模块化相关的访问报错,可在Payara的JVM启动配置中添加如下参数,开放驱动需要的模块访问权限:
--add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.sql=ALL-UNNAMED
- 完成以上调整后重启Payara服务,再执行连接池ping操作即可验证连通性。
内容的提问来源于stack exchange,提问作者dalbuja
相关产品推荐
相关产品推荐

