Java 11迁移-PoolDataSourceImpl中的createConnectionBuilder()与javax.sql.DataSource中的createConnectionBuilder()冲突

Java 11迁移-PoolDataSourceImpl中的createConnectionBuilder()与javax.sql.DataSource中的createConnectionBuilder()冲突,java,oracle,maven,ojdbc,ucp,Java,Oracle,Maven,Ojdbc,Ucp,我正在尝试将一个项目从Java8迁移到Java11,它使用ojdbc。我正在使用一个扩展PoolDataSourceImpl的类,它实现了PooLDataSource,它扩展了javax.sql.DataSource,在尝试使用maven构建它时,它给出了以下错误: 编译失败 oracle.ucp.jdbc.PoolDataSourceImpl中的[ERROR]createConnectionBuilder()无法实现创建 javax.sql.DataSource中的ConnectionBuil

我正在尝试将一个项目从Java8迁移到Java11,它使用ojdbc。我正在使用一个扩展PoolDataSourceImpl的类,它实现了PooLDataSource,它扩展了javax.sql.DataSource,在尝试使用maven构建它时,它给出了以下错误:

编译失败 oracle.ucp.jdbc.PoolDataSourceImpl中的[ERROR]createConnectionBuilder()无法实现创建 javax.sql.DataSource中的ConnectionBuilder() [错误]返回类型oracle.ucp.jdbc.UCPConnectionBuilder与java.sql.ConnectionBuilder不兼容


有人有什么建议吗?

这是接口不兼容
javax.sql.DataSource
定义了

根据合同,返回值要求为ConnectionBuilder类型

如果您查看oracle.ucp.jdbc.PoolDataSourceImpl的文档,它将该方法定义为

public UCPConnectionBuilder createConnectionBuilder()
oracle.ucp.jdbc.UCPConnectionBuilder
不是
java.sql.ConnectionBuilder
的子类型

现在,除非Oracle发布了扩展
java.sql.ConnectionBuilder
Oracle.ucp.jdbc.UCPConnectionBuilder
接口的从不版本,否则您将无法将ucp PoolDataSource与
javax.sql.DataSource
交换

此时的最新版本似乎是UCP,它仍然会遇到同样的问题,这很不幸,因为19.3被宣传为兼容JDK11。请针对Oracle UCP提出一个bug,以使维护人员知道数据源接口中新加入的createConnectionBuilder


在intrim中,如果可行的话,可以使用UCP的11g版本2(不是12,不是19),它在PoolDataSource接口上没有createConnectionBuilder方法。这不是一个理想的情况,因为你放弃了UCP十年的改进,回到11g

问题是您试图将PoolDataSourceImpl子类化,这是一个使用JDK8编译的特定于供应商的类,我们不支持扩展我们的类,除非我们明确建议这样做,如中所示;所有软件供应商都是如此。
作为这一限制的一部分,我们的驱动程序(ojdbc8.jar、ucp.jar)与较新的JDK版本(即,与JDK11一起使用)和数据库版本是向前兼容的。

在PoolDataSource上使用基于接口的代理进行代理永远不会起作用。
oracle ucp上记录了一个相同的错误。我甚至在论坛上发布了一个没有回复的问题。

你解决过这个问题吗?解决这个问题需要Oracle承认这是一个问题,并在UCP jar的新的小版本中更正这个问题。你是重新编译还是仅仅切换到JDK 11?不确定这个问题@Kuassi Mensah是什么意思?我在试图针对JDK 11编译时遇到了这个问题。@ToddSharp您已经回答了这个问题,即使用JDK 11重新编译应用程序。扩展是由UCP jar实现的。UCP的第19版引入了一个新方法createConnectionBuilder,而JDK 10在PoolDataSource扩展的数据源接口中引入了完全相同的名称,这显然是一个坏运气。所以扩展是由Oracle提供的,没错。UCP实现返回OracleConnectionBuilder的createConnectionBuilder。在Java 8中,该方法是Oracle专有的,但在Java 9中,javax.sql.DataSource定义了返回Java.sql.DataSource的createConnectionBuilder。这在Java 9中运行良好,因为oracle.jdbc.OracleConnectionBuilder扩展了ojdbc9 | 10 | 11.jar中的Java.sql.ConnectionBuilder。但是UCP是用Java8和ojdbc8.jar构建的,所以这不起作用。
public UCPConnectionBuilder createConnectionBuilder()