Oracle JDBC驱动加载失败的直接原因是Class.forName找不到oracle.jdbc.driver.OracleDriver类,本质是驱动JAR未正确进入运行时classpath或版本/路径不匹配,JDK 9+还受模块系统影响。
Oracle JDBC驱动没加载成功,Class.forName报错
直接原因是 jvm 找不到 oracle.jdbc.driver.oracledriver 类,本质是驱动 jar 没进 classpath,或进了但版本/路径不对。jdk 9+ 还可能因模块系统导致类不可见。
确认驱动 JAR 是否真在 classpath 里
别只看 IDE 的“Libraries”列表——它可能没同步到运行时 classpath。实际验证方式只有两个:
- 启动 Java 进程时加
-verbose:class,观察日志里有没有类似[Loaded oracle.jdbc.driver.OracleDriver from file:/.../ojdbc8.jar] - 运行时打印:
System.out.println(System.getProperty("java.class.path"));,然后手动检查输出路径下是否存在ojdbc8.jar(或对应版本)
常见坑:Maven 项目里写了 <scope>provided</scope> 却没配容器;Spring Boot 打成 jar 后,ojdbc*.jar 没放进 lib/ 目录或没用 spring-boot-maven-plugin 正确打包。
用对驱动类名,且注意 JDK 版本兼容性
Oracle 12c 及以后推荐用新类名:oracle.jdbc.OracleDriver(不是旧的 oracle.jdbc.driver.OracleDriver),后者在 ojdbc8+ 中已废弃,仍能用但会打警告日志;JDK 11+ 若用老类名 + ojdbc7,可能直接抛 ClassNotFoundException。
实操建议:
- 优先写
Class.forName("oracle.jdbc.OracleDriver") - 确认 JAR 名匹配:ojdbc8.jar → 对应 JDK 8–11;ojdbc11.jar → JDK 11+;别把 ojdbc6.jar 丢进 JDK 17 环境
- Tomcat 等容器中,把 JAR 放
$CATALINA_HOME/lib,别放WEB-INF/lib(否则可能因 WebAppClassLoader 隔离而找不到)
Spring Boot 项目里 driver-class-name 配错
application.yml 中写错会静默失败或启动报 Failed to load driver class:
- 必须写全限定名:
spring.datasource.driver-class-name: oracle.jdbc.OracleDriver - 别漏掉
oracle.前缀,写成jdbc.OracleDriver就会崩 - 如果用 HikariCP,还要确保
spring.datasource.hikari.driver-class-name和上面一致(否则以 Hikari 配置为准) - 使用 Spring Boot 3.x + Jakarta EE 9+ 时,确认依赖是
com.oracle.database.jdbc:ojdbc11,而非老的com.oracle.ojdbc:ojdbc8(包名不同,类路径也不同)
最易被忽略的一点:本地开发用 IDE 运行时 classpath 正常,但打包成 fat jar 后,ojdbc*.jar 如果没被 Maven 插件正确嵌入(比如用了 system scope 或手动 copy),生产环境必然报 ClassNotFoundException —— 这个问题不会在 IDE 里暴露。



















