問題
spring項目中需要調用quartz,其中配置文件中需要用到org.springframework.scheduling.quartz.CronTriggerFactoryBean包,但顯示包不存在。
解決
一、初探
一陣百度後發現需要在pom文件中加入如下配置:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
進入spring-context-support裏面有如下代碼,在調用函數的過程中需要調用這裏面的方法,只需要大致瞭解一下就行了。
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.19.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.3</version>
<scope>compile</scope>
<optional>true</optional>
</dependency>
新的問題
本來應該是加入spring-context-support就行了,但是由於我習慣性的調用最新的版本,即
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.1.3.RELEASE</version>
</dependency>
但是spring-boot-starter-parent又使用的是1.5版本,而不是2.0版本,這在調用CronTriggerFactoryBean包時報錯,如下所示:
2019-01-10 09:02:55 ERROR - An error occured instantiating job to be executed. job= 'scheduler_group.scheduler'
org.quartz.SchedulerException: Job instantiation failed
at org.springframework.scheduling.quartz.AdaptableJobFactory.newJob(AdaptableJobFactory.java:47) ~[spring-context-support-5.1.3.RELEASE.jar:5.1.3.RELEASE]
at org.quartz.core.JobRunShell.initialize(JobRunShell.java:127) [quartz-2.3.0.jar:?]
at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:392) [quartz-2.3.0.jar:?]
Caused by: java.lang.NoSuchMethodError: org.springframework.util.ReflectionUtils.accessibleConstructor(Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/reflect/Constructor;
at org.springframework.scheduling.quartz.AdaptableJobFactory.createJobInstance(AdaptableJobFactory.java:61) ~[spring-context-support-5.1.3.RELEASE.jar:5.1.3.RELEASE]
at org.springframework.scheduling.quartz.AdaptableJobFactory.newJob(AdaptableJobFactory.java:43) ~[spring-context-support-5.1.3.RELEASE.jar:5.1.3.RELEASE]
... 2 more
2019-01-10 09:02:55 INFO - All triggers of Job scheduler_group.scheduler set to ERROR state.
這時請不要百度啊,google之類的操作,程序員需要自己從報錯信息中找代碼的bug!!
解決
注意以上報錯代碼中“Caused by: java.lang.NoSuchMethodError: org.springframework.util.ReflectionUtils.accessibleConstructor(Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/reflect/Constructor;”,這表示方法沒有找到,是哪個方法呢?下一行代碼“at org.springframework.scheduling.quartz.AdaptableJobFactory.createJobInstance(AdaptableJobFactory.java:61)”就告訴你出錯的地址,ctrl+左鍵單擊進入AdaptableJobFactory.java類,對比發現是5.1.3版本去調用4.3.19版本的方法,因此報錯,去掉 pom中的5.1.3.RELEASE即可。
總結
1、spring的版本需要注意
2、百度、google雖好,但是日誌與報錯信息更重要,它是直觀反映你錯誤點的提示,慢慢積累,以後一眼就可以看穿問題所在。