遇到一个spring启动时类找不到的问题~

今天将一个老的项目部署到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

  

时间: 2024-12-18 00:05:48

遇到一个spring启动时类找不到的问题~的相关文章

spring启动component-scan类扫描加载过程---源码分析

有朋友最近问到了 spring 加载类的过程,尤其是基于 annotation 注解的加载过程,有些时候如果由于某些系统部署的问题,加载不到,很是不解!就针对这个问题,我这篇博客说说spring启动过程,用源码来说明,这部分内容也会在书中出现,只是表达方式会稍微有些区别,我将使用spring 3.0的版本来说明(虽然版本有所区别,但是变化并不是特别大),另外,这里会从WEB中使用spring开始,中途会穿插自己通过newClassPathXmlApplicationContext 的区别和联系.

spring启动component-scan类扫描加载过程(转)

文章转自 http://www.it165.net/pro/html/201406/15205.html 有朋友最近问到了 spring 加载类的过程,尤其是基于 annotation 注解的加载过程,有些时候如果由于某些系统部署的问题,加载不到,很是不解!就针对这个问题,我这篇博客说说spring启动过程,用源码来说明,这部分内容也会在书中出现,只是表达方式会稍微有些区别,我将使用spring 3.0的版本来说明(虽然版本有所区别,但是变化并不是特别大),另外,这里会从WEB中使用spring

spring启动时加载字典表数据放入map

import java.util.HashMap; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import cn.zsmy.constant.Constant; import cn.zsmy.service.tmp.ExDictService; import cn.zsmy.

spring启动时启动多个线程

1.新建一个监听器,继承spring中的ContextLoaderListener. 监听器代码如下如: 2.在web.xml中的配置如下: 3.在spring配置文件applicationContext.xml的配置如下: 其中的entry标签可以为多个.value-ref中的值为需要启动线程的bean id.

一、   Spring启动时加载和初始化bean概述

Spring Context继承关系 ClassPathXmlApplicationContext->AbstractXmlApplicationContext->AbstractRefreshableConfigApplicationContext->AbstractRefreshableApplicationContext ->AbstractApplicationContext 而AbstractRefreshableApplicationContext 包含DefaultL

mpvue项目启动时, 找不到app.json文件

在mpvue的小程序项目里app.json文件找不到了,后来发现是因为mpvue-loader的版本问题,在版本升级后,配置放的位置不一样了,以前直接写在main.js中exports default 出去,升级版本后,需要写app.json文件. 并且pages中需要写到tabBar中所有的pagePath路径,不然会报错,当然,想第一个页面是什么,就需要把那个路径放到第一位的,单个页面的配置需要在单个文件夹下新建main.json单独配置,来覆盖全局的app.json 原文地址:https:

如何在Web启动时获取Spring 上下文环境

问题如题,本文给出一个解决方案,满足以下要求: (1)Web启动时能自动获取Spring 的上下文,从而用户可以随意的获取其中的Bean. (2)在单文件测试环境中,亦可以根据配置文件路径加载Spring上下文. 大致原理为: Spring 启动时,会给任何一个实现了ApplicationContextAware接口的Bean(也可以叫做类),注入一个构造函数参数:applicationContext. 有了这样的一个类,就可以在自己的代码里轻松的获取上下文了. 编写这样的一个类还有个好处,那就

Tomcat启动时自动加载Servlet

1.想做一个服务启动时自动启动一不停止的获取订阅功能 2.之前是做一个Jsp页面请求servlet来触发方法 3.现在实现Tomcat启动时自动加载Servlet 1.Tomcat中启动Servlet时,只需要在Servlet所在的工程的配置文件web.xml中写成如下即可 <!-- 自动启动订阅接口 --> <servlet> <servlet-name>TimeServlet</servlet-name> <servlet-class>ser

如何在tomcat启动时加载一个类

Tomcat启动时classloader加载顺序 Tomcat的class加载的优先顺序一览   1.最先是$JAVA_HOME/jre/lib/ext/下的jar文件.   2.环境变量CLASSPATH中的jar和class文件.   3.$CATALINA_HOME/common/classes下的class文件.   4.$CATALINA_HOME/commons/endorsed下的jar文件.   5.$CATALINA_HOME/commons/i18n下的jar文件.   6.