Spring 整合 quartz 中 java.lang.ClassNotFoundException: org.quartz.impl.JobDetailImpl 異常解...
由於升級 Spring 版本從3到4,啟動 quartz 時報錯,報錯 java.lang.ClassNotFoundException: org.quartz.impl.JobDetailImpl 的異常資訊,quartz 版本是 1.6.1。
Caused by: java.lang.ClassNotFoundException: org.quartz.impl.JobDetailImpl at java.net.URLClassLoader$1.run(URLClassLoader.java:366) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:425) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:358) ... 21 more
導致這個異常的根本原因是因為 quartz 和 spring 的版本不相容造成的,在二者整合的時候,需要注意對應的版本。其實在 spring4.1.x 的原始碼中已經有對應的說明了,原文如下:
Compatible with Quartz 2.1.4 and higher, as of Spring 4.1.
解決辦法將 quartz 版本進行升級,並修改 quartz 的 xml 配置資訊。
quartz 1.6.1 版本下的配置資訊:
<!-- quartz --> <dependency> <groupId>org.opensymphony.quartz</groupId> <artifactId>quartz</artifactId> <version>1.6.1</version> </dependency>
<bean id="updateDocumentGeekCountTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="updateCountQuartz"/> <property name="cronExpression" value="0 10 * * * ?"/> </bean>
quartz 2.2.1 版本下的配置資訊:
<!-- quartz --> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.1</version> </dependency>
<bean id="updateDocumentGeekCountTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="updateCountQuartz"/> <property name="cronExpression" value="0 10 * * * ?"/> </bean>
原因分析
spring4.1.x 版本後,MethodInvokingJobDetailFactoryBean 類發生了改變,在初始化 JobDetail 的時候,需要 new JobDetailImpl 類,程式碼如下:
其中紅色處需要 JobDetailImpl 類,但是 quartz-1.6.1 版本中又沒有這個類,因此拋異常。
spring3.2.x 版本中的初始化程式碼如下:
Reference:
https://blog.csdn.net/liuchuanhong1/article/details/54017941
本文受原創保護,未經作者授權,禁止轉載。 linkedkeeper.com (文/張鬆然)