关键字: spring Quartz
Exception in thread "main" java.lang.NoSuchMethodError:
org.apache.commons.collections.SetUtils.orderedSet(Ljava/util/Set;)Ljava/util/Set;
at org.quartz.JobDetail.<init>(JobDetail.java:85)
这个问题困扰了我N久,幸好看到了这篇文章,写的很详细,转载下.
假设你是一个J2EE程序员,你正在使用struts2+spring2+hibernate3的时尚标准组合来开发一个项目。某天,你的项目经理告诉
你,当前项目需要开发一个新功能,需要系统来定时来执行一段代码,比如每天大半夜定时进行前一天的数据统计并且插入数据库。如果你部署的系统是Linux
并且你熟悉crontab而且你打算那么麻烦地去干,我当然没话可说。否则在你google和baidu了一会儿之后,你必然会想到可以使用著名的
quartz来和spring集成起来做这件事。
比如,先把需要干的活儿写在一个类的一个方法里面:
public class ScheduleWorker {
public void doDailyWork() {
System.out.println("今日统计完毕!");
}
}
然后,配置spring的applicationContext.xml如下:
<bean name="scheduleWorker" class="test.ScheduleWorker">
</bean>
<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="scheduleWorker" />
<property name="targetMethod" value="doDailyWork" />
<property name="concurrent" value="false" />
</bean>
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="jobDetail" />
<!-- 每天零点 -->
<property name="cronExpression">
<value>0 0 * * * ?</value>
</property>
</bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean" autowire="no">
<property name="triggers">
<list>
<ref bean="cronTrigger" />
</list>
</property>
</bean>
然
后编译上传(别忘了上传更新的applicationContext.xml还有quartz.jar,一般都在spring解开的包的
lib/quartz目录下面)。你重新启动你的tomcat(也可能是resin或者其他什么东西),然后,不出意外地,发现如下错误:
ERROR [org.springframework.web.context.ContextLoader] - Context initialization failed
org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'jobDetail' defined in ServletContext
resourc
e [/WEB-INF/classes/applicationContext-service.xml]:
Invocation of init method failed; nested exception is
java.lang.NoSuchMethodErr
or: org.apache.commons.collections.SetUtils.orderedSet(Ljava/util/Set;)Ljava/util/Set;
如果你经验比较丰富,你会去找你部署的服务器的WEB-INF/lib下面是不是存在commons-collections的jar包,然后你很惊奇地发现它的确在那里,你会很困惑。
如
果你经验十分丰富,你知道了commons-collections.jar的确存在于classpath里面,你知道引起
NoSuchMethodErr的原因很可能是部署服务器上的commons-collections.jar的版本过低,在quartz调用的时候不存
在而导致的,于是你会去检查WEB-INF/lib下面的commons-collections.jar的版本,然后你还是会很惊奇地发现它的版本是
3.2,并且在这个jar包里面的确存在org.apache.commons.collections.SetUtils这个类,并且方法
orderedSet也存在,你还是会很困惑。
如果你经验非常丰富,你知道了引起上面这种情况的原因是系统的classloader
先加载了其他地方低版本的commons-collections里面的
org.apache.commons.collections.SetUtils类,导致WEB-INF/lib下面的commons-
collections.jar里面的同名类没有被加载所导致的。于是你就到处去找另外的commons-collections.jar,在WEB-
INF/lib你可能会找到一个,包括common/lib等等地方,如果你是jdk6,你还有可能在jdk的ext目录下找到。删掉老版本的
commons-collections.jar,重启tomcat,发现问题依旧,你继续找。但是皇天不负有心人,你啥都没找到,整个jdk和整个
tomcat下面,你整个搜索了一番,只有这么一个commons-collections.jar。你依然会很困惑。
不卖关子了。解决问题的办法:删除WEB-INF/lib/checkstyle-all.jar,重新启动tomcat,问题解决。
在
hibernate3的lib目录下,存在commons-collections-2.1.1.jar和checkstyle-all.jar,一般我
们都是直接上传到WEB-INF/lib,前者不必说,版本太老而被classloader先加载了,按说删了问题应该解决了,但是为什么必须删掉
checkstyle-all.jar问题才能正式解决呢。拿WinRAR打开checkstyle-all.jar一看你就知道了,里面赫然有
org.apache.commons.collections.SetUtils这个类,并且,它是老版本的!
这也太可恶了,明明
叫checkstyle-all.jar,里面为啥还包含commons-collections的东西……而且还是老调牙的版本。另外,如果你觉得
checkstyle-all.jar或许还有点什么用处,可以用WinRAR解开之后把commons-collections的包和类去掉,然后重新
打包上传。
其实问题的根源在于:hibernate3使用老版本(2.1.1)的commons-collections及包含它的
checkstyle-all.jar,而spring2.5使用新版本(3.2)的commons-collections以及需要3.2版本
commons-collections的quartz。
分享到:
相关推荐
基于springboot+mybatis+ mvc + activitiy+quarts+quartz 写的一个办公企业OA系统 #### 软件架构 springboot+mybatis+ mvc + activitiy+quarts+quartz #### 说明 ##### 功能: 用户模块 日志模块 考勤模块...
标题 "基于 springboot+mybatis_+shiro + redis+activiti+quarts+quart.zip" 提供了一个关于综合应用多个技术栈构建项目的信息。这个项目似乎是一个使用Spring Boot、MyBatis、Shiro、Redis、Activiti、Quartz和...
【标题】"基于 springboot+mybatis_+shiro + redis+activiti+quarts+quart76.zip" 涵盖了多个关键的技术栈,这些技术在现代企业级应用开发中扮演着重要角色。下面将分别详细介绍这些技术及其在实际应用中的作用。 *...
该项目利用了基于springboot + vue + mysql的开发...Java、Python、Node.js、Spring Boot、Django、Express、MySQL、PostgreSQL、MongoDB、React、Angular、Vue、Bootstrap、Material-UI、Redis、Docker、Kubernetes
本项目“spring-quarts_quartus_springboot_”结合了Spring Boot与Quartz,创建了一个基于Spring Boot的定时任务系统。 首先,我们要理解Spring Boot的核心特性。Spring Boot的核心理念是“约定优于配置”,它内置...
基于 springboot+myvatis_+ mvc + activiti+quarts+quartz 写的一个办公企业管理系统 OA 软件架构 springboot+myvatis_+ mvc + activiti+quarts+quartz 说明 功能: 用户模块 日志模块 考勤模块 工作流模块 请假 ...
基于 springboot+mybatis_+shiro + redis+activiti+quarts+quartz+vue 写的一个前后分离办公企业管理系统 ,通用服务端,用于学习。 使用技术 服务端: springboot(2.2.1) + mybatis-push + shiro(1.4.0) + redis +...
基于 springboot+myvatis_+ mvc + activiti+quarts+quartz 写的一个办公企业管理系统 OA 软件架构 springboot+myvatis_+ mvc + activiti+quarts+quartz 说明 功能: 用户模块 日志模块 考勤模块 工作流模块 请假 ...
这是quarts使用过程中要用到的各种包
使用技术服务端: springboot(2.2.1) + mybatis-push + shiro(1.4.0) + redis + activiti(5.2.1)pc端:vue2.0 + element-ui项目结构web_pc:新版本的pc端sys-oa: 新版本的服务端部署缺失的jar包在 根目录的lib下,...
基于 springboot+myvatis_+ mvc + activiti+quarts+quartz 写的一个办公企业管理系统 OA 软件架构 springboot+myvatis_+ mvc + activiti+quarts+quartz 说明 功能: 用户模块 日志模块 考勤模块 工作流模块 请假 ...
在Spring框架中集成Quartz是一款常见的任务调度解决方案,它允许开发者在应用中安排定时任务的执行。Quartz是一个开源的作业调度框架,可以用来在Java应用程序中安排复杂的作业任务。以下将详细介绍如何在Spring中...
Quartz的核心库通常包括`quartz`和`quartz-jobs`两个JAR包,确保它们在项目类路径下可用。 接下来,我们需要创建一个配置类来初始化Quartz Scheduler。在Spring Boot项目中,可以创建一个`@Configuration`类,并...
这个"quarts使用例子"应该包含了一些关于如何在Quartz中配置、创建和执行任务的示例代码。让我们深入了解一下Quartz的核心概念和使用方法。 首先,Quartz的核心组件包括Scheduler、Job和Trigger。Scheduler是调度器...
在Spring Boot应用中整合Quartz定时任务是一种常见的需求,它可以帮助我们执行周期性的后台任务,如数据同步、报表生成等。Spring Boot与Quartz的结合提供了便捷的配置方式,特别是通过YAML(YAML Ain't Markup ...
NULL 博文链接:https://lancui.iteye.com/blog/898719
### FPGA-QUARTUS:详解Quartus II中文教程手册中的关键知识点 #### 一、Quartus II 简介 Quartus II 是由 Altera 公司(现已被 Intel 收购)开发的一款功能强大的 FPGA/CPLD 设计软件。它支持多种硬件描述语言...
定时调度框架quarts的JAR包,很好用