1. 程式人生 > >遇到一個spring啟動時類找不到的問題~

遇到一個spring啟動時類找不到的問題~

eclips singleton jar ebe esc apach star ole bsp

今天將一個老的項目部署到Tomcat7上運行時,spring初始化一直失敗,提示錯誤如下:
Java.lang.NoClassDefFoundError:org.springframework.beans.FatalBeanException

控制臺打印的堆棧信息如下:

[org.springframework.web.context.ContextLoader]-[ERROR] Context initialization failed

java.lang.NoClassDefFoundError: org.springframework.beans.FatalBeanException
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:547)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:755)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:434)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4738)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5181)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717)
at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:586)
at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1780)
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at java.lang.Thread.run(Unknown Source)

解決過程:

1. 可能是類未被添加到buildpath或類未被正確引入到tomcat的部署路徑下。

  ctrl+shift+T搜索,在spring-beans-3.2.0.RELEASE.jar這個包下找到了這個類,確認jar包已被添加到項目的bulidpath中了。

  接著去tomcat的項目部署路徑下查看,發現項目下有這個jar包,將jar包解壓,的確有FatalBeanException類。

  如此奇怪,類確實存在,為什麽還會報類找不到的錯誤

2. 跟蹤spring源碼,查看拋出異常的具體位置。

  通過錯誤提示信息上描述的doCreateBean方法錯誤,找到spring-beans-3.2.0.RELEASE.jar下對應的這個方法,在該方法上打斷點。

然後以Debug方式啟動,程序運行到上面的斷點上,一步步跟蹤,發現出問題的地方了:

Object exposedObject = bean;
    try {
        populateBean(beanName, mbd, instanceWrapper);
        if (exposedObject != null) {
            exposedObject = initializeBean(beanName, exposedObject, mbd);
        }
    }
    catch (Throwable ex) {
        if (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) {
            throw (BeanCreationException) ex;
        }
        else {
       //這裏的ex對象,實際上是一個java.lang.StackOverflowError,即:棧溢出錯誤。但是控制臺上給出的提示信息卻是:NoClassDefFoundError。 throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Initialization of bean failed", ex); } }

  找到問題的原因了:即JVM的棧設置小了,出現棧溢出。

3. 調整tomcat啟動時JVM的棧內存大小,該問題就解決了。

  Eclipse-->windows-->preference-->java-->install jres-->選擇JDK-->edit-->添加啟動參數-Xss16m

  技術分享

遇到一個spring啟動時類找不到的問題~