IDEA启动tomcat报错:java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext、ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component
先看错误日志:
-May- ::29.838 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Server version: Apache Tomcat/9.0..M26
-May- ::29.844 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Server built: Aug :: UTC
-May- ::29.845 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Server number: 9.0.0.0
-May- ::29.845 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name: Windows
-May- ::29.845 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version: 10.0
-May- ::29.845 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture: amd64
-May- ::29.845 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home: D:\Dev\Java\jdk1..0_102\jre
-May- ::29.845 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version: 1.8.0_102-b14
-May- ::29.845 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor: Oracle Corporation
-May- ::29.845 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE: C:\Users\wulf\.IntelliJIdea2018.\system\tomcat\Unnamed_manage_system_home_2
-May- ::29.845 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME: D:\Dev\apache-tomcat-9.0..M26
-May- ::29.846 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.config.file=C:\Users\wulf\.IntelliJIdea2018.\system\tomcat\Unnamed_manage_system_home_2\conf\logging.properties
-May- ::29.847 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-May- ::29.848 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:,suspend=y,server=n
Caused by: java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext
at java.lang.Class.getDeclaredFields0(Native Method)
at java.lang.Class.privateGetDeclaredFields(Class.java:)
at java.lang.Class.getDeclaredFields(Class.java:)
at org.apache.catalina.util.Introspection.getDeclaredFields(Introspection.java:)
at org.apache.catalina.startup.WebAnnotationSet.loadFieldsAnnotation(WebAnnotationSet.java:)
at org.apache.catalina.startup.WebAnnotationSet.loadApplicationListenerAnnotations(WebAnnotationSet.java:)
at org.apache.catalina.startup.WebAnnotationSet.loadApplicationAnnotations(WebAnnotationSet.java:)
at org.apache.catalina.startup.ContextConfig.applicationAnnotationsConfig(ContextConfig.java:)
at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:)
at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:)
... more
Caused by: java.lang.ClassNotFoundException: org.springframework.context.ApplicationContext
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:)
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:)
... more -May- ::36.530 严重 [RMI TCP Connection()-127.0.0.1] org.apache.tomcat.util.modeler.BaseModelMBean.invoke Exception invoking method manageApp
java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/wlf-voicebox]]
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:)
at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:)
at java.lang.reflect.Method.invoke(Method.java:)
at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:)
at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:)
at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:)
at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:)
at java.lang.reflect.Method.invoke(Method.java:)
at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:)
at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:)
at com.sun.jmx.remote.security.MBeanServerAccessController.invoke(MBeanServerAccessController.java:)
at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:)
at javax.management.remote.rmi.RMIConnectionImpl.access$(RMIConnectionImpl.java:)
at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:)
at java.security.AccessController.doPrivileged(Native Method)
at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:)
at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:)
at java.lang.reflect.Method.invoke(Method.java:)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:)
at sun.rmi.transport.Transport$.run(Transport.java:)
at sun.rmi.transport.Transport$.run(Transport.java:)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$(TCPTransport.java:)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:)
at java.lang.Thread.run(Thread.java:) -May- ::36.532 严重 [RMI TCP Connection()-127.0.0.1] org.apache.tomcat.util.modeler.BaseModelMBean.invoke Exception invoking method createStandardContext
javax.management.RuntimeOperationsException: Exception invoking method manageApp
at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:)
at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:)
at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:)
at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:)
at java.lang.reflect.Method.invoke(Method.java:)
at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:)
at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:)
at com.sun.jmx.remote.security.MBeanServerAccessController.invoke(MBeanServerAccessController.java:)
at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:)
at javax.management.remote.rmi.RMIConnectionImpl.access$(RMIConnectionImpl.java:)
at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:)
at java.security.AccessController.doPrivileged(Native Method)
at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:)
at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:)
at java.lang.reflect.Method.invoke(Method.java:)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:)
at sun.rmi.transport.Transport$.run(Transport.java:)
at sun.rmi.transport.Transport$.run(Transport.java:)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$(TCPTransport.java:)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:)
at java.lang.Thread.run(Thread.java:)
Caused by: java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/wlf-voicebox]]
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:)
at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:)
at java.lang.reflect.Method.invoke(Method.java:)
at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:)
... more -May- ::41.469 信息 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [D:\Dev\apache-tomcat-9.0..M26\webapps\manager]
日志里告诉我们tomcat启动时加载类失败了,导致web容器无法启动。定位问题首先得场景复现,这里我从头开始进行。一开始我的tomcat是可以启动的,但一修改了pom文件后就出现了上述异常,所以我从正常的设置开始。Eclipse与IDEA的一个不同点是tomcat的部署:Eclipse默认支持代码改动后重启tomcat;IDEA需要先自己打出个war包,再自己去重启tomcat。为了避免每次都打包耗费大量时间(虽然每次打包时间不多,但你若频繁变动代码,积少成多,聚沙成塔,每天将耗费不少时间在打包上)。我们需要设置IDEA打war exploded包,它跟war有啥区别呢?
war包:Web application ARchive,其实也是一种JAR文件,自然也是一种压缩包,包含用来JSP、Java Servlet、Java类、XML文件、标签库、静态网页(HTML和相关文件),以及构成Web应用程序的其他资源;
exploded包:其实就是war包的展开,也就是war、jar等产出物没压缩前的目录结构。在开发的时候使用这种模式可使修改文件的效果立刻显现出来。
另外我这个项目的jar包都是本地引用,而非引用了maven仓库的jar包,我的pom文件需要制定范围和引用地址:
<dependency>
<groupId>javazoom</groupId>
<artifactId>jlayer</artifactId>
<version>1.0.1</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/main/webapp/lib/jlayer-1.0.1.jar</systemPath>
</dependency>
上面可以看到我将jar包放在src/main/webapp/lib这个目录下,而这个目录并非maven的约定目录(这点是关键)。接着我们需要进行部署的配置,通过快捷键Ctrl+Alt+Shift+S弹出项目结构(Project Structure)窗口,左边菜单中的Project主要用来指定JDK,接着我们看下Modules,里面有3个tab
- Sources:显示项目的目录资源,都是项目部署的时候需要的目录,不同颜色代表不同的类型,选中左边的目录再点击上面Mark as对应的类型即可设置。详见下图;
 - Paths:可以指定项目的编译输出目录,即项目类和测试类的编译输出地址,使用默认路径即可
 - Dependencies:项目的依赖,使用默认依赖即可
 

这几类目录都比较好理解,需要注意的是Excluded Folders配置的是让IDEA忽略的目录,一般是编译后的输出目录,这里加入的lib目录是我们的本地jar包目录,我们只是用来配置jar包,部署时会在WEB-INF自动生成对应lib包,所以可以忽略。
跳过Libraries和Facets,我们直接进入部署的关键点。打开IDEA的artifact -> 点击左边菜单栏的Artifacts -> 选中原有的artifact(默认是war包的artifact)并点减号删除 -> 点加号新增一个artifact -> 下拉框选第二个(Exploded) -> 继续二级下拉框选来自Module(From Modules) -> 选中之前配置的Module即可。

这时你可以看到默认设置了一个output目录,tomcat启动时读取的就是该目录下的相关文件和资源。Output Layout就是output里面的布局,我们可以看到其实就是WEB-INF目录,它有编译后的字节码文件所在的classes目录和引入的jar包所在的lib目录。

最后一步就是配置tomcat server,在Deployment中加入我们刚刚配置好的artifact。
当你点击运行tomcat时,IDEA开始干这些事情:
- 编译,IDEA在保存/自动保存后不会做编译,不像Eclipse的保存即编译,因此在运行server前会做一次编译(其实就是maven构建,这就是为啥我们可以不用自己用maven跑一遍的原因)。编译后class文件存放在指定的项目编译输出目录(target)下;
 - 根据artifact中的设定对目录结构(如上面的WEB-INF的classes和lib)进行创建;
 - 拷贝web资源的根目录下的所有文件到artifact的目录(不仅仅是WEB-INF的classes和lib)下;
 - 拷贝编译输出目录下的classes目录到artifact下的WEB-INF(WEB-INF/classes)下;
 - 拷贝lib目录下所需的jar包到artifact下的WEB_INF/lib下;
 - 运行server,运行成功后,自动打开浏览器访问指定url。
 
以上是正常情况,废话不多说,复现异常:把pom文件的一把jar包由本地引用改为maven引入本地仓库,如下:
<dependency>
<groupId>javazoom</groupId>
<artifactId>jlayer</artifactId>
<version>1.0.1</version>
</dependency>
接着按IDEA的提示Import Changes(导入pom文件变动),直接重启tomcat,再看下我们的artifact的WEB-INF/lib目录已经为空了:

同样的,Project Structure的Artifacts下的lib目录不翼而飞了:

这里因为jar包引用了maven的本地仓库,导致我们的war结构(其实就是WEB-INF/lib目录)发生了变动,lib目录的jar包被清空了。为啥呢?因为我们通过maven引入jar包,那么就得按maven的规则来玩了。它将自动创建一个war包的artifact,它将从webapp/WEB-INF/lib目录取jar包,而我们没有该目录,那么它会创建一个,但里面只有一个我们配置的jar包(jlayer-1.0.1.jar),然后tomcat启动加载类时bug出现了。既然Spring的jar包都没了,自然tomcat启动时会找不到ApplicationContext这个类了。
解决办法有两个,一个是将maven引入的那个jar包改用本地引入;另一个是遵守maven的约定,修改lib目录,从webapp/lib挪到webapp/WEB-INF/lib并对应修改pom文件里引入本地jar包的路径。第一个办法还是上面的老路子,修改pom文件,重新设置Artifacts(先删掉现有的所有artifact,因为maven创建了一个默认的war包artifact,再加上原来的war exploded,所以会有两个,然后新增一个新的war exploded),删掉前面maven自动生成的target/工程名/WEB-INF下的lib目录,重启tomcat(参见前面启动tomcat时IDEA干的事,如果不重启tomcat,artifact的输出目录下lib将会一直是空的,它需要tomcat启动时去复制target目录下的lib包到artifact的输出目录下);第二个办法更合理一些,改完后同样需要重新设置Artifacts,删掉target/工程名下的lib目录,重启tomcat。
IDEA启动tomcat报错:java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext、ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component的更多相关文章
- 【报错】java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[
		
报错 java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleExce ...
 - java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]
		
1.问题描述: 对于创建的springboot项目,通过启动类启动,访问没问题,但打成war部署到tomcat上启动报错,如下: 严重: ContainerBase.addChild: start: ...
 - maven 项目启动tomcat报错 java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
		
maven项目启动tomcat报错: java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderLi ...
 - springboot启动tomcat报错java.lang.NoClassDefFoundError: javax/el/ELManager仅记录
		
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'o ...
 - java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext
		
***************************错误提示************************************************ SEVERE: A child cont ...
 - 解决:启动项目报错 java.lang.NoClassDefFoundError: org/apache/commons/fileupload/FileItemFactory
		
前言:项目在 spring-mvc.xml 文件中配置了上传文件拦截,结果启动报错 java.lang.NoClassDefFoundError: org/apache/commons/fileupl ...
 - myeclipse中运行tomcat报错java.lang.NoClassDefFoundError
		
有关myeclipse的小问题,在myeclipse中运行tomcat时显示已启动,但是无法访问localhost:8080/,显示404错误.在控制台中发现报错代码如下: java.lang.NoC ...
 - 使用ssm整合是项目启动tomcat报错java.lang.IndexOutOfBoundsException
		
解决办法:删除.m2文件夹下的全部仓库,然后重启myeclipse,对项目进行maven project.问题解决. 在没有这样做时,除了tomcat启动会失败,项目还有会报如下错误: ①cvc-co ...
 - eclipse中启动tomcat报错 java.lang.ClassNotFoundException
		
之前启动还好好的,某次启动tomcat就莫名其妙的报了这个java.lang.ClassNotFoundException的错. 检查maven依赖包,发现这个类是存在的. 然后一通clean操作 ...
 
随机推荐
- CentOS阿里仓库停止openstack mitaka源服务报错------“No package centos-release-openstack-mitaka available.”
			
之前学习了一个月的openstack的mitaka版本,部署完后放置一段时间,最近准备正式部署突然发现“No package centos-release-openstack-mitaka avail ...
 - Codeforces Round 585
			
Codeforces Round 585 浅论如何发现自己是傻子的-- 反正今天是完全蒙的,水了签到题就跑了-- A. Yellow Cards 签到题. 众所周知,CF的签到题一般是一道神神奇奇的数 ...
 - Light OJ - 1026 - Critical Links(图论-Tarjan算法求无向图的桥数)  -  带详细注释
			
原题链接 无向连通图中,如果删除某边后,图变成不连通,则称该边为桥. 也可以先用Tajan()进行dfs算出所有点 的low和dfn值,并记录dfs过程中每个 点的父节点:然后再把所有点遍历一遍 ...
 - 河南省acm第九届省赛--《表达式求值》--栈和后缀表达式的变形--手速题
			
表达式求值 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 假设表达式定义为:1. 一个十进制的正整数 X 是一个表达式.2. 如果 X 和 Y 是 表达式,则 X+Y, ...
 - [转]BIO/NIO/AIO的几个思考
			
原文:https://www.jianshu.com/p/ff29e028af07 ----------------------------------------------------- BIO/ ...
 - erase & remove_if 合用
			
words_.erase( remove_if( words_.begin(), words_.end(), [&](const entry& e) { return (e.type ...
 - eclipse等编辑器选中列快编辑的方法
			
一.eclipse 1.首先按alt+shift+a,开启块选择模式 2.使用鼠标进行块选择 3.再次按Alt+Shift+a即可关闭块选择模式 二.EditPlus 1.菜单:编辑 -> 选择 ...
 - vmware 共享文件夹不显示文件的问题
			
上海SEO:安装vmtools后还是不显示执行以下操作//但是只有root权限才行 1:输入命令 sudo apt install open-vm-tools 安装工具2:输入命令 sudo vmh ...
 - jquery模仿淘宝星星打分
			
今天做论坛页面有星星评分功能,以下是代码.用的时候引入jquery <span> <ul class="hs_df_xx"> <li><i ...
 - LOJ3102. 「JSOI2019」神经网络 [DP,容斥,生成函数]
			
传送门 思路 大部分是感性理解,不保证完全正确. 不能算是神仙题,但我还是不会qwq 这题显然就是求:把每一棵树分成若干条链,然后把链拼成一个环,使得相邻的链不来自同一棵树,的方案数.(我才不告诉你们 ...