在将应用程序部署到tomcat服务器时,我遇到以下错误:
2013-06-14 07:54:36 ErrorLogger [ERROR] Job (DEFAULT.NearByRioDeJaneiro threw an exception. org.quartz.SchedulerException: Job threw an unhandled exception. [See nested exception: java.lang.NoClassDefFoundError: Could not initialize class com.frrole.service.common.OAuthUtil] at org.quartz.core.JobRunShell.run(JobRunShell.java:224) at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:557) Caused by: java.lang.NoClassDefFoundError: Could not initialize class com.frrole.service.common.OAuthUtil at com.frrole.service.common.City._getTweetsByQueryObj(City.java:357) at com.frrole.service.common.City.getTweetsByGeoLocSearch(City.java:340) at com.frrole.service.api.TwitterSearch.nearbyLocationSearch(TwitterSearch.java:148) at com.frrole.service.imports.jobs.NearByRioDeJaneiro.execute(NearByRioDeJaneiro.java:14) at org.quartz.core.JobRunShell.run(JobRunShell.java:213)
从此错误日志中可以看出,主要问题是tomcat无法定位:com.frrole.service.common.OAuthUtil类。此类由该方法引用_getTweetsByQueryObj类com.frrole.service.common.City。因此,在执行此方法时,tomcat无法找到OAuthUtil类。OAuthUtil类在其代码中定义了正确的package语句。该应用程序还可以成功编译,否则将无法生成ws.war。
com.frrole.service.common.OAuthUtil
_getTweetsByQueryObj
com.frrole.service.common.City
令人困惑的部分是,OAuthUtil类与类位于同一包(和目录)中City。下面是lstomcat的webapps文件夹的ws目录中的目录树。
OAuthUtil
City
ls
root@servicesfrrole3:/usr/tomcat/apache-tomcat-7.0.25/webapps/ws/WEB-INF/classes/com/frrole/service/common# ls -l total 88 -rw-r--r-- 1 root root 12284 2013-06-14 13:15 City.class -rw-r--r-- 1 root root 21350 2013-06-14 13:15 DBUtil.class -rw-r--r-- 1 root root 1064 2013-06-14 13:15 Messages.class -rw-r--r-- 1 root root 2026 2013-06-14 13:15 OAuthUtil$_AccessToken.class -rw-r--r-- 1 root root 2741 2013-06-14 13:15 OAuthUtil.class -rw-r--r-- 1 root root 1710 2013-06-14 13:15 ReTweet.class -rw-r--r-- 1 root root 1431 2013-06-14 13:15 SQLUtils.class -rw-r--r-- 1 root root 6397 2013-06-14 13:15 TimeAgo.class -rw-r--r-- 1 root root 3363 2013-06-14 13:15 Tweet.class -rw-r--r-- 1 root root 3730 2013-06-14 13:15 TweetUtil.class -rw-r--r-- 1 root root 5982 2013-06-14 13:15 TweetVO.class -rw-r--r-- 1 root root 1328 2013-06-14 13:15 TwitterResults.class -rw-r--r-- 1 root root 1941 2013-06-14 13:15 ViaTweet.class
可以看出,显然有一个OAuthUtil.class与City.class驻留在同一目录中 。该代码可以正确编译,并且可以在具有Java 7和Tomcat 7.0.40的localhost上完美运行。该服务器在服务器上具有Java 7和Tomcat 7.0.25。
部署应用程序时,我只是在localhost上编译它,然后将ws.war文件复制到服务器的webapps目录中,然后将其复制到先前应用程序中ws文件夹的rm -r并最终重新启动服务器。
如果有人对这里发生的事情有任何解释,请提供一些解决方案。
线索在异常消息中:
"Could not initialize class com.frrole.service.common.OAuthUtil"
实际上发生的是某个类初始化器中 先前 已发生错误。(也许是OAuthUtil类本身,也可能是它所依赖的其他一些类。)如果回顾日志文件,应该会看到异常。
现在,您已经执行了某些代码,该代码取决于先前未能初始化的类。结果就是这个异常。
如果您无法在日志文件中找到先前的异常,则可能是由于该异常被“压扁”,或者是由于应用程序未定义默认的未捕获异常处理程序而在某个线程死亡时丢失了。