【问题标题】:When I tried to instantiate JobOperator then a ClassNotFoundException was thrown. (org.apache.commons.dbcp2.BasicDataSource)当我尝试实例化 JobOperator 时,抛出了 ClassNotFoundException。 (org.apache.commons.dbcp2.BasicDataSource)
【发布时间】:2021-04-19 19:35:08
【问题描述】:

我从一个基本的 Spring Batch 入门示例开始。我只添加了一条指令以在开始时停止作业,但在运行时出现异常。

https://github.com/brunogcarneiro/spring-batch-error/blob/main/src/main/java/com/example/batchprocessing/JobCompletionNotificationListener.java

@Override
public void beforeJob(JobExecution jobExecution){
    log.info("Job starting!");
    BatchRuntime.getJobOperator().stop(jobExecution.getId());
    log.info("Job stoped!");
}

当我调用 getJobOperato() 时抛出异常。一旦我使用 spring-boot-starter-batch,我无法弄清楚为什么会发生这种情况。

完整的源代码可以在:https://github.com/brunogcarneiro/spring-batch-error

堆栈跟踪是:

2021-01-14 15:09:01.963 ERROR 126675 --- [main] o.s.batch.core.job.AbstractJob >:执行作业时遇到致命错误

java.util.ServiceConfigurationError: javax.batch.operations.JobOperator: Provider >org.springframework.batch.core.jsr.launch.JsrJobOperator 无法实例化 在 java.base/java.util.ServiceLoader.fail(ServiceLoader.java:581) ~[na:na] 在 java.base/java.util.ServiceLoader$ProviderImpl.newInstance(ServiceLoader.java:803) ~>[na:na] 在 java.base/java.util.ServiceLoader$ProviderImpl.get(ServiceLoader.java:721) ~[na:na] 在 java.base/java.util.ServiceLoader$3.next(ServiceLoader.java:1394) ~[na:na] 在 javax.batch.runtime.BatchRuntime$1.run(BatchRuntime.java:52) ~[javax.batch-api-1.0.jar:1.0] 在 javax.batch.runtime.BatchRuntime$1.run(BatchRuntime.java:47) ~[javax.batch-api-1.0.jar:1.0] 在 java.base/java.security.AccessController.doPrivileged(Native Method) ~[na:na] 在 javax.batch.runtime.BatchRuntime.getJobOperator(BatchRuntime.java:47) ~[javax.batch-api->1.0.jar:1.0] 在 >com.example.batchprocessing.JobCompletionNotificationListener.beforeJob(JobCompletionNotificationListener.java:31) ~[main/:na] 在 >org.springframework.batch.core.listener.CompositeJobExecutionListener.beforeJob(CompositeJobExecutionListener.java:73) ~[spring-batch-core-4.2.1.RELEASE.jar:4.2.1.RELEASE] 在 org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:316) ~[spring->batch-core-4.2.1.RELEASE.jar:4.2.1.RELEASE] 在 org.springframework.batch.core.launch.support.SimpleJobLauncher$1.run(SimpleJobLauncher.java:147) ~[spring-batch-core-4.2.1.RELEASE.jar:4.2.1.RELEASE] 在 org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:50) ~[spring-core-5.2.2.RELEASE.jar:5.2.2.RELEASE] 在 org.springframework.batch.core.launch.support.SimpleJobLauncher.run(SimpleJobLauncher.java:140) ~[spring-batch-core-4.2.1.RELEASE.jar:4.2.1.RELEASE] 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na] 在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] 在 java.base/java.lang.reflect.Method.invoke(Method.java:566) ~[na:na] 在 org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE] 在 org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE] 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE] 在 org.springframework.batch.core.configuration.annotation.SimpleBatchConfiguration$PassthruAdvice.invoke(SimpleBatchConfiguration.java:127) ~[spring-batch-core-4.2.1.RELEASE.jar:4.2.1.RELEASE] 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE] 在 org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE] 在 com.sun.proxy.$Proxy46.run(Unknown Source) ~[na:na] 在 org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner.execute(JobLauncherCommandLineRunner.java:192) ~[spring-boot-autoconfigure-2.2.2.RELEASE.jar:2.2.2.RELEASE] 在 org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner.executeLocalJobs(JobLauncherCommandLineRunner.java:166) ~[spring-boot-autoconfigure-2.2.2.RELEASE.jar:2.2.2.RELEASE] 在 org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner.launchJobFromProperties(JobLauncherCommandLineRunner.java:153) ~[spring-boot-autoconfigure-2.2.2.RELEASE.jar:2.2.2.RELEASE] 在 org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner.run(JobLauncherCommandLineRunner.java:148) ~[spring-boot-autoconfigure-2.2.2.RELEASE.jar:2.2.2.RELEASE] 在 org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:784) ~[spring-boot-2.2.2.RELEASE.jar:2.2.2.RELEASE] 在 org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:768) ~[spring-boot-2.2.2.RELEASE.jar:2.2.2.RELEASE] 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:322) ~[spring-boot-2.2.2.RELEASE.jar:2.2.2.RELEASE] 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) ~[spring-boot-2.2.2.RELEASE.jar:2.2.2.RELEASE] 在 org.springframework.boot.SpringApplication.run(SpringApplication.java:1215) ~[spring-boot-2.2.2.RELEASE.jar:2.2.2.RELEASE] 在 com.example.batchprocessing.BatchProcessingApplication.main(BatchProcessingApplication.java:10) ~[main/:na] 原因:org.springframework.beans.factory.BeanCreationException:创建名为“jobRepository”的bean时出错:设置bean属性“dataSource”时无法解析对bean“dataSource”的引用;嵌套异常是 org.springframework.beans.factory.CannotLoadBeanClassException:找不到类路径资源 [jsrBaseContext.xml] 中定义的名称为“dataSource”的 bean 的类 [org.apache.commons.dbcp2.BasicDataSource];嵌套异常是 java.lang.ClassNotFoundException: org.apache.commons.dbcp2.BasicDataSource 在 org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:342) ~[spring-beans-5.2.2.RELEASE.jar:5.2.2.RELEASE] 原因:org.springframework.beans.factory.BeanCreationException:创建名为“jobRepository”的bean时出错:设置bean属性“dataSource”时无法解析对bean“dataSource”的引用;嵌套异常是 org.springframework.beans.factory.CannotLoadBeanClassException:找不到类路径资源 [jsrBaseContext.xml] 中定义的名称为“dataSource”的 bean 的类 [org.apache.commons.dbcp2.BasicDataSource];嵌套异常是 java.lang.ClassNotFoundException: org.apache.commons.dbcp2.BasicDataSource

在 org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:113) ~[spring-beans-5.2.2.RELEASE.jar:5.2.2.RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1699) ~[spring-beans-5.2.2.RELEASE.jar:5.2.2.RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1444) ~[spring-beans-5.2.2.RELEASE.jar:5.2.2.RELEASE] 在 >org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(Abstr>actAutowireCapableBeanFactory.java:594) ~[spring-beans-5.2.2.RELEASE.jar:5.2.2.RELEASE] 在 >org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(Abstract>tAutowireCapableBeanFactory.java:517) ~[spring-beans-5.2.2.RELEASE.jar:5.2.2.RELEASE] 在 org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323) ~[spring-beans-5.2.2.RELEASE.jar:5.2.2.RELEASE] 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.2.2.RELEASE.jar:5.2.2.RELEASE] 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321) ~[spring-beans-5.2.2.RELEASE.jar:5.2.2.RELEASE] 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-5.2.2.RELEASE.jar:5.2.2.RELEASE] 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:860) ~[spring-beans-5.2.2.RELEASE.jar:5.2.2.RELEASE] 在 org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:878) ~[spring-context-5.2.2.RELEASE.jar:5.2.2.RELEASE] 在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550) ~[spring-context-5.2.2.RELEASE.jar:5.2.2.RELEASE] 在 org.springframework.context.support.GenericXmlApplicationContext.(GenericXmlApplicationContext.java:71) ~[spring-context-5.2.2.RELEASE.jar:5.2.2.RELEASE] 在 org.springframework.batch.core.jsr.launch.JsrJobOperator$BaseContextHolder.(JsrJobOperator.java:831) ~[spring-batch-core-4.2.1.RELEASE.jar:4.2.1.RELEASE] 在 >org.springframework.batch.core.jsr.launch.JsrJobOperator$BaseContextHolder.getInstance(JsrJobOp>erator.java:839) ~[spring-batch-core-4.2.1.RELEASE.jar:4.2.1.RELEASE] 在 org.springframework.batch.core.jsr.launch.JsrJobOperator.(JsrJobOperator.java:163) >~[spring-batch-core-4.2.1.RELEASE.jar:4.2.1.RELEASE] 在 java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) >~[na:na] 在 >java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:na] 在 >java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:na] 在 java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490) ~[na:na] 在 java.base/java.util.ServiceLoader$ProviderImpl.newInstance(ServiceLoader.java:779) ~[na:na] ...省略了33个常用框架 原因:org.springframework.beans.factory.CannotLoadBeanClassException:找不到类路径资源[jsrBaseContext.xml]中定义的名称为“dataSource”的bean的类[org.apache.commons.dbcp2.BasicDataSource];嵌套异常是 java.lang.ClassNotFoundException: org.apache.commons.dbcp2.BasicDataSource 原因:org.springframework.beans.factory.CannotLoadBeanClassException:找不到类路径资源[jsrBaseContext.xml]中定义的名称为“dataSource”的bean的类[org.apache.commons.dbcp2.BasicDataSource];嵌套异常是 java.lang.ClassNotFoundException: org.apache.commons.dbcp2.BasicDataSource

在 org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1476) ~[spring-beans-5.2.2.RELEASE.jar:5.2.2.RELEASE] 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:489) ~[spring-beans-5.2.2.RELEASE.jar:5.2.2.RELEASE] 在 org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323) ~[spring-beans-5.2.2.RELEASE.jar:5.2.2.RELEASE] 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.2.2.RELEASE.jar:5.2.2.RELEASE] 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321) ~[spring-beans-5.2.2.RELEASE.jar:5.2.2.RELEASE] 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-5.2.2.RELEASE.jar:5.2.2.RELEASE] 在 >org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:330) ~[spring-beans-5.2.2.RELEASE.jar:5.2.2.RELEASE] ...省略了54个常用框架 引起:java.lang.ClassNotFoundException:org.apache.commons.dbcp2.BasicDataSource 在 java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581) ~[na:na] 引起:java.lang.ClassNotFoundException: org.apache.commons.dbcp2.BasicDataSource

at >java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) ~>[na:na] 在 java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522) ~[na:na] 在 java.base/java.lang.Class.forName0(Native Method) ~[na:na] 在 java.base/java.lang.Class.forName(Class.java:398) ~[na:na] 在 org.springframework.util.ClassUtils.forName(ClassUtils.java:277) ~[spring-core-5.2.2.RELEASE.jar:5.2.2.RELEASE] 在 org.springframework.beans.factory.support.AbstractBeanDefinition.resolveBeanClass(AbstractBeanDefinition.java:456) ~[spring-beans-5.2.2.RELEASE.jar:5.2.2.RELEASE] 在 org.springframework.beans.factory.support.AbstractBeanFactory.doResolveBeanClass(AbstractBeanFactory.java:1541) ~[spring-beans-5.2.2.RELEASE.jar:5.2.2.RELEASE] 在 org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1468) ~[spring-beans-5.2.2.RELEASE.jar:5.2.2.RELEASE] ...省略了60个常用帧

2021-01-14 15:09:02.013 INFO 126675 --- [main] osbclsupport.SimpleJobLauncher:作业:[FlowJob:[name=importUserJob]] 使用以下参数完成:[{run.id=1 }] 和以下状态: [FAILED] in 9s845ms 2021-01-14 15:09:02.016 INFO 126675 --- [main] com.zaxxer.hikari.HikariDataSource:HikariPool-1 - 已启动关闭... 2021-01-14 15:09:02.019 INFO 126675 --- [main] com.zaxxer.hikari.HikariDataSource >:HikariPool-1 - 关闭完成。

【问题讨论】:

  • @Rakesh 的回答应该可以解决您的问题。但是,我没有看到在开始之前停止工作的意义。
  • @MahmoudBenHassine 的想法是执行一些验证以检查作业是否应该执行。

标签: java spring-batch


【解决方案1】:

请在您的 build.gradle 中添加以下内容。

compile group: 'org.apache.commons', name: 'commons-dbcp2', version: '2.8.0'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-07
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多