ojdbc驱动版本必须与Oracle数据库主版本匹配,如ojdbc8对应12c+,且需使用官方Maven坐标com.oracle.database.jdbc:ojdbc8,避免混用旧groupId或本地JAR。
ojdbc 版本和 Oracle 数据库版本必须匹配
oracle 官方明确要求 ojdbc 驱动版本不能随意升级或降级——比如用 ojdbc8 连接 oracle 11g 可能报 ora-28040: no matching authentication protocol,而用 ojdbc6 连 oracle 19c 则大概率触发 java.sql.sqlfeaturenotsupportedexception。驱动和数据库主版本号(如 11g、12c、19c、21c)需对齐,小版本号(如 19.21.0.0 vs 19.23.0.0)通常向后兼容,但建议优先选该主版本推荐的最新驱动。
Maven 中正确声明 ojdbc8(对应 Oracle 12c+)
Oracle 自 18.3 起将 ojdbc 推送至 Maven Central,不再需要手动下载 JAR 或配置私有仓库。直接使用官方坐标即可:
<dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc8</artifactId> <version>21.11.0.0</version> </dependency>
注意以下几点:
-
ojdbc8支持 JDK 8+,对应 Oracle 12.1 及以上;若项目还在用 JDK 7,必须改用ojdbc7(仅支持到 Oracle 12.1) - 不要混用
com.oracle.ojdbc:ojdbc8(旧 groupId,已废弃)和com.oracle.database.jdbc:ojdbc8(当前唯一有效) - 避免依赖传递引入旧版:检查
mvn dependency:tree -Dincludes=ojdbc,发现冲突时用<exclusions>显式排除
连接 URL 和属性要配合驱动版本调整
新版 ojdbc8 默认启用更严格的安全策略,老写法容易失败。例如:
- Oracle 12c+ 必须显式指定服务名(
service_name),不能只靠SID;URL 应为jdbc:oracle:thin:@//host:port/service_name,而非@host:port:SID -
oracle.jdbc.mapDateToTimestamp=false在 19c+ 驱动中已废弃,改用oracle.jdbc.dateAsDate=true - 若遇到 TLS 握手失败,需加
?oracle.net.ssl_version=1.2,尤其在 Oracle Cloud 或启用了 TLS 1.2 强制策略的环境
本地开发时 classpath 里有多个 ojdbc JAR 就会出问题
IDE(如 IntelliJ)经常缓存旧版驱动,或从其他模块继承了冲突的 ojdbc6.jar。运行时报 java.lang.NoSuchMethodError: oracle.jdbc.driver.OracleDriver.connect 很可能就是类加载到了错误版本。
排查步骤:
- 启动时加 JVM 参数
-verbose:class,搜索日志中oracle/jdbc/driver/OracleDriver加载路径 - 检查
target/classes/META-INF/maven/下是否有其他依赖带入了 ojdbc - IDE 中右键项目 → “Maven” → “Reload project”,确保不读取本地
lib/下的手动 JAR
最稳妥的做法是:全项目统一用 Maven 声明,彻底删除所有手动添加的 ojdbc JAR 文件——哪怕它看起来“能连上”。



















