Java8升级Java11遇OracleConnectionBuilderImpl与ConnectionBuilder兼容问题
问题分析与解决方案
编译错误详情
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project <project>: Compilation failure [ERROR] <project>.java:[15,8] createConnectionBuilder() in oracle.jdbc.datasource.impl.OracleDataSource cannot implement createConnectionBuilder() in javax.sql.DataSource [ERROR] return type oracle.jdbc.datasource.impl.OracleConnectionBuilderImpl is not compatible with java.sql.ConnectionBuilder
问题根源
Java 11 对 javax.sql.DataSource 接口做了扩展,新增了 createConnectionBuilder() 方法,要求返回 java.sql.ConnectionBuilder 类型。而部分 ojdbc8 版本中,OracleDataSource 实现的该方法返回的是 Oracle 自定义的 OracleConnectionBuilderImpl,如果这个类未实现标准的 java.sql.ConnectionBuilder 接口,就会触发编译时的类型兼容错误。
解决方案
1. 排查并清理依赖冲突
执行 mvn dependency:tree 命令,检查项目依赖树:
- 确认是否混入旧版本 ojdbc(如 ojdbc6、ojdbc7)
- 检查是否有第三方依赖间接引入旧版 Oracle JDBC 组件
- 核对
javax.sql相关依赖版本是否统一
找到冲突依赖后,在对应 dependency 节点中通过 <exclusions> 排除旧版本组件,确保仅保留指定的 ojdbc8:23.3.0.23.09。
2. 明确配置 Maven 编译插件的 Java 版本
确保 maven-compiler-plugin 明确指定编译的 source 和 target 为 Java 11,避免编译规则兼容问题:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <source>11</source> <target>11</target> <encoding>UTF-8</encoding> </configuration> </plugin>
3. 重写 createConnectionBuilder() 方法强制类型兼容
如果上述步骤无效,直接在自定义的 MtDataSource 类中重写该方法,明确返回标准的 java.sql.ConnectionBuilder 接口类型:
import oracle.jdbc.pool.OracleDataSource; import java.sql.ConnectionBuilder; import java.sql.SQLException; public class MtDataSource extends OracleDataSource { public MtDataSource() throws SQLException { super(); } @Override public ConnectionBuilder createConnectionBuilder() { return super.createConnectionBuilder(); } }
4. 验证 Oracle JDBC 依赖完整性
确保项目引入的 ojdbc8 依赖包含完整适配类,必要时补充引入辅助依赖(需使用 Oracle 官方 Maven 仓库):
<dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ojdbc8</artifactId> <version>23.3.0.23.09</version> </dependency> <dependency> <groupId>com.oracle.database.jdbc</groupId> <artifactId>ucp</artifactId> <version>23.3.0.23.09</version> </dependency>
内容的提问来源于stack exchange,提问作者Tapialj
相关产品推荐
相关产品推荐

