idea部署tomcat启动报错java.lang.NoClassDefFoundError: Could not initialize class org.springframework.be...

痴心易碎 提交于 2020-04-06 06:27:28

这一次的启动错误,让我花了整整两天解决(未完全解决),导致都没有产出,的确让人抓狂,必须来一篇博客记载,方才去除一波疼痛。

先贴一下错误日志: 

java.lang.NoClassDefFoundError: org.springframework.beans.FatalBeanException
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
	at org.springframework.context.event.AbstractApplicationEventMulticaster.getApplicationListeners(AbstractApplicationEventMulticaster.java:148)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:86)
	at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:324)
	at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1025)
	at org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:988)
	at org.springframework.web.context.ContextLoader.closeWebApplicationContext(ContextLoader.java:541)
	at org.springframework.web.context.ContextLoaderListener.contextDestroyed(ContextLoaderListener.java:142)
	at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:5183)
	at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5874)
	at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:257)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:187)
	at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:1007)
	at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:983)
	at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:639)
	at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1899)
	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:497)
	at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:303)
	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:633)
	at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:577)
	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:497)
	at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:303)
	at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
	at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
	at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1466)
	at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76)
	at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1307)
	at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1399)
	at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:828)
	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:497)
	at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:323)
	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$254(TCPTransport.java:683)
	at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler$$Lambda$1/1951350272.run(Unknown Source)
	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)
2020-04-01 23:34:50,214 [RMI TCP Connection(3)-127.0.0.1hread] [ - // -  - ] WARN 
2020-04-01 23:34:50,481 [RMI TCP Connection(10.118.239.202:3181)hread] [ - // -  - ] ERROR org.apache.zookeeper.ClientCnxn$1.uncaughtException(ClientCnxn.java:414) - from RMI TCP Connection(10.118.239.202:3181)
	at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1795)
java.lang.NoClassDefFoundError: org/apache/zookeeper/server/ZooTrace

好了,正题开始。

①同一个项目工程,其它同事运行无问题,同样的idea版本、tomcat版本、JDK版本,那么排除代码问题。

②我maven打包:mvn clean package, 打出来的war直接丢到tomcat/webapps下运行,项目可以正常启动,排除maven问题。

③以上NoClassDefFoundError错误提示,无非就是加载jar问题,好吧,直接查看工程下target下对应工程的WEB-INF/lib,发现同一个依赖jar竟然存在不同时间戳的版本,这个网上查资料,参考到文章《idea tomcat 部署 jar包重复问题》,原因是SNAPSHOT的问题,我的解决办法是直接把本地maven仓库对应的JAR删除,还有其他的办法,我都试过,但均不管用,idea跑起tomcat,一样又出现重复jar。

PS: 发现第三点,我用的办法是比较工具对比可以正常运行的WAR解压后与idea编译的项目target目录比较,由于粗心,竟使我多花了将近一天时间 o(╥﹏╥)o

④好吧,没有办法,debug启动,跟spring源码,发现在DefaultListableBeanFactory.preInstantiateSingletons()方法里, 获取bean的实现,
        RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName); 这行加断点,执行到这F8往下走完getBean(),执行完后,再全部禁用断点接着运行就可以启动。

PS:目前我仍然不知道为何如此,如有知晓的高手可以提点一下

⑤以上都搞定,idea跑起项目来,仍然报错。竟分析应该是JVM参数的配置问题,于是乎把VM参数配置成: -Xss1024k -XX:PermSize=128M -XX:MaxPermSize=256m ,启动仍然报错,怀疑VM参数是否配置生效,查看启动控制台日志如下:

四月 02, 2020 12:40:06 下午 org.apache.catalina.startup.VersionLoggerListener log
信息: Command line argument: -Xss1024k
四月 02, 2020 12:40:06 下午 org.apache.catalina.startup.VersionLoggerListener log
信息: Command line argument: -XX:PermSize=128M
四月 02, 2020 12:40:06 下午 org.apache.catalina.startup.VersionLoggerListener log
信息: Command line argument: -XX:MaxPermSize=512m
四月 02, 2020 12:40:06 下午 org.apache.catalina.startup.VersionLoggerListener log

看着日志,应该已经配置生效,但仍然报错,这是为何?(反正我无解)

无奈之下,我不得已打开了多年不用的Eclipse 配起tomcat不额外配VM参数跑起项目,也是一样报错,加上VM参数: -Xss1024k -XX:PermSize=128M -XX:MaxPermSize=256m 仍然不行,那就简单一点:只加 -Xss1024k, 重启,TMD竟然成功了,法克~~~ ~~o(>_<)o ~~

好吧,我也只能把-Xss1024k在IDEA配置跑起项目,竟然还是报错,至此,我只能怀疑是VM参数配置不生效或VM参数配置能达到项目启动的基本要求。

在JVM的几个参数PermSize、MaxPermSize、Xms、Xmx、Xss几个参数不停更改测试,最后将问题锁定在Xss参数上。

 

解决:

 Xss 参数含义是: JAVA线程堆栈大小,查询相关资料显示,JDK1.5后,默认就是1024K(算我前面白配这个参数了吧)

  • 由于本项目工程代码为15年的老项目,在此上不断追加class、新增依赖jar、启动加线程等,工程不断庞大,启动花费的时间原来越多,目前已经每次启动都要花费几分钟。之所以很难定位到这个参数,是因为Xss这个参数按生产配置-Xss1024k,把本地打出的war丢到测试服务器,启动完全OK,再加上咨询了经验丰富的同事告知1024k已经完全足够了,所以一直排除到最后,改大点从2058k调到1124k,debug 跑起来均能正常启动,所以应该可以确认的是1024k已经不能满足当前项目的线程堆栈大小,配置截图如下:

  • 另外一点,配置成-Xss1024k,使用run模式,也能正常,但debug就是起不来,查看对比一下run与debug的区别

debug模式启动参数

JAVA_OPTS=-agentlib:jdwp\=transport\=dt_socket,address\=127.0.0.1:64284,suspend\=y,server\=n -Xss1024k

run模式启动参数

JAVA_OPTS=-Xss1024k

dubug模式多开一个远程端口供调试用。

 

最后至此,仍然存在2个未解决的问题:上诉问题①,同样的代码,别人不加参数为何能正常启动?上诉问题④,为什么Dedug卡断点却可以?

以上2个问题我至今也还不知道答案,如后续知晓再更新吧。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!