如何将Oracle驱动程序依赖项添加到Spring Data Flow Server?

问题描述 投票:0回答:1

我目前正在尝试使用Spring Batch的Spring Data Flow Server。我的application.properties中有两个数据源。而且,Spring Batch应用程序可以正常工作,并且可以将数据读取和写入数据库。

但是当我尝试在Spring Cloud Data Flow服务器中部署Jar文件时,SCDF不会从application.properties文件中加载属性,也不会加载默认的h2配置。在启动SCDF时,我也尝试将config作为参数传递,但是在类路径中找不到Oracle Driver。但是请记住批处理作业可以工作并插入数据。我的问题是,在SCDF启动期间将那些数据库配置作为参数传递时,我应该在哪里保留Oracle Jdbc Driver jar(ojdbc7-1.0.0)?或如何添加依赖性,以便SCDF可以看到数据库配置。下面是我如何传递数据库参数。

java -jar spring-cloud-dataflow-server-2.4.2.BUILD-20200310.115040-7.jar
 --spring.datasource.url=jdbc:oracle:thin:@mydb
 --spring.datasource.username=username 
 --spring.datasource.password=password 
 --spring.datasource.driver-class-name=oracle.jdbc.OracleDriver

还有我得到的例外,

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'org.springframework.boot.actuate.autoconfigure.jdbc.DataSourceHealthContributorAutoConfiguration': Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: oracle.jdbc.OracleDriver
        at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:798)
        at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:228)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1358)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1204)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:557)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517)
        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
        at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:409)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1338)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1177)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:557)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517)
        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:617)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:605)
        at org.springframework.context.support.AbstractApplicationContext.getBeansOfType(AbstractApplicationContext.java:1242)
        at org.springframework.boot.actuate.autoconfigure.health.HealthEndpointConfiguration.healthContributorRegistry(HealthEndpointConfiguration.java:78)

我在另一个SO问题中发现,可以将oracle驱动程序依赖项添加到SCDF。但是他没有明确提到如何,而且我没有足够的观点要发表评论。因此在这里发布。我指向的答案的链接是,

spring-data-flow task example

I have fixed the same issue by getting SCDF source code & added oracle dependency jars and ran the command same as above. It worked. You need to make sure that you added drivers for DB in SCDF before running the above command. SCDF comes with DB related jars but if you are using oracle or some third party you need to add it manually. 

感谢您的任何帮助。

注:在我的应用程序中,我扩展了DefaultTaskConfigurer并返回了具有Task_Execution和相关表的Oracle数据源。但这似乎无济于事。

java oracle spring-boot datasource spring-cloud-dataflow
1个回答
0
投票

根据Spring Cloud Data Flow reference(第24.1.1节),您应在应用程序pom文件的dependencies部分中添加所需数据库驱动程序的依赖性(在您的情况下为Oracle)。

<dependencies>
...
    <dependency>
      <groupId>com.oracle.ojdbc</groupId>
      <artifactId>ojdbc8</artifactId>
      <version>19.3.0.0</version>
    </dependency>
...
</dependencies>

然后您必须按照此处所述构建应用程序:Building Spring Cloud Data Flow

如今对我们来说很幸运,Maven Central上提供了Oracle的JDBC驱动程序

© www.soinside.com 2019 - 2024. All rights reserved.