配置Spring Cloud Dataflow的Oracle JDBC源时如何解决驱动加载错误?
我正尝试使用Spring Cloud Dataflow搭建一条ETL管道,以Oracle作为数据源,自定义应用作为处理器/转换器,MySQL作为数据接收器。同时,Spring Cloud Dataflow Server也使用Oracle作为后端数据库,我已修改spring-cloud-dataflow-server的pom.xml(如下diff所示),使Dataflow Web界面可正常运行。
修改的Dataflow Server pom.xml
diff --git a/spring-cloud-dataflow-server/pom.xml b/spring-cloud-dataflow-server/pom.xml index da2bc2c72..710ca1287 100644 --- a/spring-cloud-dataflow-server/pom.xml +++ b/spring-cloud-dataflow-server/pom.xml @@ -18,7 +18,7 @@ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> - <oracle-driver-ojdbc8.version>21.9.0.0</oracle-driver-ojdbc8.version> + <oracle-driver-ojdbc8.version>19.3.0.0</oracle-driver-ojdbc8.version> <maven-javadoc-plugin.version>3.4.1</maven-javadoc-plugin.version> <maven-source-plugin.version>3.3.0</maven-source-plugin.version> <checkstyle.config.location>../src/checkstyle/checkstyle.xml</checkstyle.config.location> @@ -171,10 +171,9 @@ <scope>test</scope> </dependency> <dependency> - <groupId>com.oracle.database.jdbc</groupId> + <groupId>com.oracle.ojdbc</groupId> <artifactId>ojdbc8</artifactId> <version>${oracle-driver-ojdbc8.version}</version> - <scope>test</scope> </dependency> <dependency> <groupId>mysql</groupId>
但目前的问题是无法将Oracle作为流定义的JDBC源使用。我按照文档提示修改了Spring Cloud Skipper的pom.xml,但部署流时,转换器和MySQL接收器部署成功,Oracle JDBC源却出现报错:
报错信息
Caused by: java.lang.IllegalStateException: Cannot load driver class: oracle.jdbc.OracleDriver
我已下载Oracle驱动并导入本地Maven仓库,重新构建Spring Cloud Skipper,但问题仍未解决。以下是我的流定义简化版本:
流定义
my-stream=oracle:jdbc --max-messages-per-poll=1000 --fixed-delay=30s --password=xxxxxxxx --driver-class-name=oracle.jdbc.OracleDriver --username=my_user --url=jdbc:oracle:thin:@my-oracle-db.com:1521/my_service_name --update="UPDATE /* ... */" --query="SELECT /* ... */" | my-transform-app | mysql:jdbc --password="xxxxxxxx" --driver-class-name=org.mariadb.jdbc.Driver --username=my_user --url="jdbc:mysql://my-mysql-db.com:3306/my_database" --table-name=my_table
请问配置Oracle JDBC源时我还遗漏了什么步骤?
你需要检查并完成以下关键步骤:
为JDBC源应用添加Oracle驱动依赖
Spring Cloud Dataflow的JDBC源是独立运行的应用,和Skipper、Dataflow Server的依赖分离。你有两种方式添加驱动:- 自定义打包JDBC源应用,在其pom.xml中加入依赖:
<dependency> <groupId>com.oracle.ojdbc</groupId> <artifactId>ojdbc8</artifactId> <version>19.3.0.0</version> </dependency> - 在流定义中通过
mavenDependencies参数动态引入:oracle:jdbc --max-messages-per-poll=1000 ... --mavenDependencies=com.oracle.ojdbc:ojdbc8:19.3.0.0
- 自定义打包JDBC源应用,在其pom.xml中加入依赖:
验证Maven仓库的驱动可访问性
确认本地Maven仓库中确实存在com.oracle.ojdbc:ojdbc8:19.3.0.0依赖,且Skipper、Dataflow Server的配置能访问到该仓库(如果是私有仓库,需在服务配置中添加仓库地址和认证信息)。修正流定义的语法错误
原流定义中oracle: jdbc的空格是多余的,应改为oracle:jdbc,空格可能导致应用识别异常。确认Skipper的依赖配置有效性
修改Skipper的pom.xml时,确保Oracle驱动的<scope>不是test,groupId和版本与你的环境匹配,且重新构建后启动的是新版本的Skipper服务。验证驱动类名兼容性
对于ojdbc8 19.3.0.0版本,oracle.jdbc.OracleDriver是正确的类名,也可以尝试兼容旧版的oracle.jdbc.driver.OracleDriver测试是否能加载成功。
内容的提问来源于stack exchange,提问作者Eugene M

