在本文中,我们将带你了解java.lang.NoClassDefFoundError:org/springframework/web/context/ContextCleanupListener问题在
在本文中,我们将带你了解java.lang.NoClassDefFoundError:org / springframework / web / context / ContextCleanupListener问题在这篇文章中,同时我们还将给您一些技巧,以帮助您实现更有效的ClassNotFoundException: org.springframework.web.context.ContextLoaderListener、eclipse中部署web项目时报错java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoader...、Error configuring application listener of class [org.springframework.web.context.ContextLoaderListen、IDEA 启动 tomcat 报错:java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext、Con...。
本文目录一览:- java.lang.NoClassDefFoundError:org / springframework / web / context / ContextCleanupListener问题
- ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
- eclipse中部署web项目时报错java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoader...
- Error configuring application listener of class [org.springframework.web.context.ContextLoaderListen
- IDEA 启动 tomcat 报错:java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext、Con...
java.lang.NoClassDefFoundError:org / springframework / web / context / ContextCleanupListener问题
我得到这个错误
SEVERE: Exception sending context destroyed event to listener instance of class org.springframework.web.context.ContextLoaderListenerjava.lang.NoClassDefFoundError: org/springframework/web/context/ContextCleanupListener at org.springframework.web.context.ContextLoaderListener.contextDestroyed(ContextLoaderListener.java:80) at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:5035) at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5687) at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:232) at org.apache.catalina.core.ContainerBase.removeChild(ContainerBase.java:1028) at org.apache.catalina.startup.HostConfig.undeploy(HostConfig.java:1498) at org.apache.catalina.startup.HostConfig.checkResources(HostConfig.java:1425) at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1646) at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:328) at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117) at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90) at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1374) at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1546) at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1556) at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1524) at java.lang.Thread.run(Thread.java:745)Caused by: java.lang.ClassNotFoundException: org.springframework.web.context.ContextCleanupListener at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1720) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571) ... 16 more
但是,我查看已部署的文件夹,然后看到包含该文件的jar,我在做什么错呢?
https://github.com/davidahines/spacechip/tree/spring_security
问题是当我尝试转到localhost:8080 / spacechip时,出现“资源不可用”。
这是我的配置。
答案1
小编典典该jar可能位于您的已部署文件夹中,但是该jar(或具有通配符的已部署文件夹)是否位于CLASSPATH中?
ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
严重: Error configuring application listener of class [org.springframework.web.util.Log4jConfigListener]
java.lang.ClassNotFoundException: org.springframework.web.util.Log4jConfigListener
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1285)
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1119)
at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:512)
at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:493)
at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:119)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4667)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5207)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1419)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1409)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:748)
七月 07, 2017 9:12:46 上午 org.apache.catalina.core.StandardContext listenerStart
严重: Error configuring application listener of class [org.springframework.web.context.ContextLoaderListener]
java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1285)
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1119)
at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:512)
at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:493)
at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:119)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4667)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5207)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1419)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1409)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:748)
七月 07, 2017 9:12:46 上午 org.apache.catalina.core.StandardContext listenerStart
严重: Skipped installing application listeners due to previous error(s)
七月 07, 2017 9:12:46 上午 org.apache.catalina.core.StandardContext startInternal
严重: One or more listeners failed to start. Full details will be found in the appropriate container log file
七月 07, 2017 9:12:46 上午 org.apache.catalina.core.StandardContext startInternal
严重: Context [/game] startup failed due to previous errors
七月 07, 2017 9:12:46 上午 org.apache.coyote.AbstractProtocol start
信息: Starting ProtocolHandler ["http-nio-8081"]
七月 07, 2017 9:12:46 上午 org.apache.coyote.AbstractProtocol start
信息: Starting ProtocolHandler ["ajp-nio-8010"]
七月 07, 2017 9:12:46 上午 org.apache.catalina.startup.Catalina start
信息: Server startup in 3134 ms
tomcat启动报错。
一直都好好的。今天启动就报错了。也有这个spring-web的jar包。
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
eclipse中部署web项目时报错java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoader...
解决方案:
1.右键点击项目--选择Properties,选择Deployment Assembly,在右边点击Add按钮,在弹出的窗口中选择Java Build Path Entries
2.点击Next,选择Maven Dependencies
3.点击Finish,然后可以看到已经把Maven Dependencies添加到Web应用结构中了
操作完后,重新部署工程,不再报错了。然后我们再到.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\目录下,发现工程WEB-INF目录下自动生成了lib目录,并且所有的依赖jar包也都已经部署进来。问题因此解决。
Error configuring application listener of class [org.springframework.web.context.ContextLoaderListen

。classpath 添加:
<classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER">
<attributes>
<attribute name="org.eclipse.jst.component.dependency" value="/WEB-INF/lib"/>
</attributes>
</classpathentry>
developement 里面添加 mavenlib
IDEA 启动 tomcat 报错:java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext、Con...
先看错误日志:
27-May-2019 17:07:29.838 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Server version: Apache Tomcat/9.0.0.M26
27-May-2019 17:07:29.844 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Server built: Aug 2 2017 20:29:05 UTC
27-May-2019 17:07:29.845 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Server number: 9.0.0.0
27-May-2019 17:07:29.845 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name: Windows 10
27-May-2019 17:07:29.845 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version: 10.0
27-May-2019 17:07:29.845 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture: amd64
27-May-2019 17:07:29.845 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home: D:\Dev\Java\jdk1.8.0_102\jre
27-May-2019 17:07:29.845 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version: 1.8.0_102-b14
27-May-2019 17:07:29.845 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor: Oracle Corporation
27-May-2019 17:07:29.845 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE: C:\Users\wulf\.IntelliJIdea2018.3\system\tomcat\Unnamed_manage_system_home_2
27-May-2019 17:07:29.845 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME: D:\Dev\apache-tomcat-9.0.0.M26
27-May-2019 17:07:29.846 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.config.file=C:\Users\wulf\.IntelliJIdea2018.3\system\tomcat\Unnamed_manage_system_home_2\conf\logging.properties
27-May-2019 17:07:29.847 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
27-May-2019 17:07:29.848 信息 [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:51337,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:2583)
at java.lang.Class.getDeclaredFields(Class.java:1916)
at org.apache.catalina.util.Introspection.getDeclaredFields(Introspection.java:110)
at org.apache.catalina.startup.WebAnnotationSet.loadFieldsAnnotation(WebAnnotationSet.java:262)
at org.apache.catalina.startup.WebAnnotationSet.loadApplicationListenerAnnotations(WebAnnotationSet.java:88)
at org.apache.catalina.startup.WebAnnotationSet.loadApplicationAnnotations(WebAnnotationSet.java:64)
at org.apache.catalina.startup.ContextConfig.applicationAnnotationsConfig(ContextConfig.java:328)
at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:778)
at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:299)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5003)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
... 44 more
Caused by: java.lang.ClassNotFoundException: org.springframework.context.ApplicationContext
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1269)
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1104)
... 57 more
27-May-2019 17:07:36.530 严重 [RMI TCP Connection(3)-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:744)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:716)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:703)
at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1729)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:287)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:456)
at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:405)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:287)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
at com.sun.jmx.remote.security.MBeanServerAccessController.invoke(MBeanServerAccessController.java:468)
at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1468)
at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76)
at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1309)
at java.security.AccessController.doPrivileged(Native Method)
at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1408)
at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:324)
at sun.rmi.transport.Transport$1.run(Transport.java:200)
at sun.rmi.transport.Transport$1.run(Transport.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:683)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
27-May-2019 17:07:36.532 严重 [RMI TCP Connection(3)-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:295)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:456)
at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:405)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:287)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
at com.sun.jmx.remote.security.MBeanServerAccessController.invoke(MBeanServerAccessController.java:468)
at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1468)
at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76)
at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1309)
at java.security.AccessController.doPrivileged(Native Method)
at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1408)
at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:324)
at sun.rmi.transport.Transport$1.run(Transport.java:200)
at sun.rmi.transport.Transport$1.run(Transport.java:197)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:683)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
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:744)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:716)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:703)
at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1729)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:287)
... 35 more
27-May-2019 17:07:41.469 信息 [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.catalina.startup.HostConfig.deployDirectory Deploying web application directory [D:\Dev\apache-tomcat-9.0.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。
今天的关于java.lang.NoClassDefFoundError:org / springframework / web / context / ContextCleanupListener问题的分享已经结束,谢谢您的关注,如果想了解更多关于ClassNotFoundException: org.springframework.web.context.ContextLoaderListener、eclipse中部署web项目时报错java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoader...、Error configuring application listener of class [org.springframework.web.context.ContextLoaderListen、IDEA 启动 tomcat 报错:java.lang.NoClassDefFoundError: org/springframework/context/ApplicationContext、Con...的相关知识,请在本站进行查询。
本文标签: