javaweb项目使用Quartz定时任务填坑记

手上有一个比较旧的项目,在引入使用Quartz时,遇到了坑,已填平望勿踩。日常填坑,潦草记录,直奔主题。

坑1:ContainerBase.addChild: start: ;Unsupported major.minor version 51.0

严重: ContainerBase.addChild: start: 
org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/quartz]]
 at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:440)
 at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:198)
 at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:1007)
 at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:983)
 at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:639)
 at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1296)
 at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:2038)
 at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)
 at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
 at java.util.concurrent.FutureTask.run(FutureTask.java:138)
 at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
 at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.UnsupportedClassVersionError: org/quartz/SchedulerException : Unsupported major.minor version 51.0 (无法载入的.[org.quartz.SchedulerException])
 at org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:3250)
 at org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:1416)
 at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1921)
 at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1795)
 at java.lang.Class.getDeclaredFields0(Native Method)
 at java.lang.Class.privateGetDeclaredFields(Class.java:2291)
 at java.lang.Class.getDeclaredFields(Class.java:1743)
 at org.apache.catalina.util.Introspection.getDeclaredFields(Introspection.java:106)
 at org.apache.catalina.startup.WebAnnotationSet.loadFieldsAnnotation(WebAnnotationSet.java:270)
 at org.apache.catalina.startup.WebAnnotationSet.loadApplicationListenerAnnotations(WebAnnotationSet.java:90)
 at org.apache.catalina.startup.WebAnnotationSet.loadApplicationAnnotations(WebAnnotationSet.java:68)
 at org.apache.catalina.startup.ContextConfig.applicationAnnotationsConfig(ContextConfig.java:417)
 at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:891)
 at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:388)
 at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123)
 at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5545)
 at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
 ... 11 more

这个错误网上有不少解决的办法,也试了N种,然而都不奏效;原因是这个错误可能范围太广,每个解决办法都是针对具体的问题的,所以长时间未解决。于是强压内心急躁,深吸三口新鲜空气,静下心分析错误;果不其然,仔细往下看,发现:Unsupported major.minor version 51.0(无法载入的.类[org.quartz.SchedulerException])检查一下导入类,SchedulerException存在,那就可以确定了,Quartz支持的JDK版本问题,因为前面有一错误提示:Unsupported major.minor version 51.0。前面已经介绍项目太旧用的JDK1.6,这次Quartz选用的是2.3.0版本(已经有更高的版本,开始就考虑到项目可能不会支持太高版本,所以没有选最新版),我打开Quartz一看,傻眼2.3.0版本是使用的JDK1.7.0_75构建的,这下找到了问题的根源,没办法升级JDK使用1.8版本,到这里本以为项目能顺利启动运行,结果还是GG,打击自信,只怪自己学艺不精,忘了修改Tomcat的默认编译JDK版本(下图),修改成1.6+,这个坑就顺利填平!

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.7.1
Created-By: Apache Maven Bundle Plugin
Bnd-LastModified: 1492630917015
Build-Jdk: 1.7.0_75
BuildInfo-Host: tc-eng-002
BuildInfo-Revision: unknown
BuildInfo-Timestamp: 20170419-154134

javaweb项目使用Quartz定时任务填坑记_第1张图片

坑2:java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory

这个严格意义上说实际不能算到坑的行列,这个错误有点Java基础的一眼就能知道症结在哪里,一个典型且常见的错误:找不到类。记录以加深印象,使用Quartz时,必须要引入slf4j相关的日志jar,因为Quartz中org.quartz.impl.StdSchedulerFactory有依赖它。关键不解的一点是:一个相对独立的定时任务框架为什么要依赖sl4j,难道是另有隐情强制使用有什么深层的考虑,希望有了解的大神赐教!

java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
 at org.quartz.impl.StdSchedulerFactory.<init>(StdSchedulerFactory.java:302)
 at org.quartz.impl.StdSchedulerFactory.getDefaultScheduler(StdSchedulerFactory.java:1573)
 at com.quartz.ApplicationContextListener.contextInitialized(ApplicationContextListener.java:30)
 at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:5136)
 at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5662)

你可能感兴趣的:(异常笔记)