我們的項目基于Spring Boot + Maven,采用Intelli IDEA工具進行開發。代碼在另一名同事的機器上檢出之后,啟動項目時,始終出現如下錯誤提示:
<code>
03-11 15:41:23[org.springframework.boot.SpringApplication-825][main][13298] - Application startup failed
java.lang.NoClassDefFoundError: javax/servlet/http/HttpServletResponse
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
at java.lang.Class.getDeclaredMethods(Class.java:1975)
at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:609)
at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:521)
at org.springframework.util.ReflectionUtils.doWithMethods(ReflectionUtils.java:507)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors(AutowiredAnnotationBeanPostProcessor.java:241)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.determineConstructorsFromBeanPostProcessors(AbstractAutowireCapableBeanFactory.java:1069)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1042)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:764)
at org.springframework.boot.SpringApplication.doRun(SpringApplication.java:357)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:305)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1124)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1113)
at cn.com.icaifeng.Application.main(Application.java:33)
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 com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
Caused by: java.lang.ClassNotFoundException: javax.servlet.http.HttpServletResponse
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 29 more
</code>
開始懷疑是JDK或JRE設置的問題,但項目完全可以編譯成功,所以此點可以排除。從錯誤信息:<code> javax/servlet/http/HttpServletResponse</code>可以看是Servlet的問題,Sevlet是java的web server一個容器,那么是不是表示這個容器類無法加載進行初始化?利用bing及百度做了一些查找(不要問為什么不用google),并未找到解決方案。折騰了三個小時之后,最終放棄了直接解決這個問題。讓同事重新安裝了Intell IDEA,并重新下載代碼進行編譯運行,居然一切正常,真讓人想哭又想笑!自己內心松了一口氣,雖然并未找到真正的原因,但終究這個問題消失了。
“欠下的債,終究要還的!”在沒過兩日的今天,在自己的機器居然也出現了這種問題,折騰近一個小時仍舊沒有找到原因與解決辦法,真是有點讓人奔潰,有點想放棄了。但轉念一想,如果今日放棄,想必日后肯定還會再次遇到,何不今日多花點時間,徹底弄清這個問題,找出原因與解決方案。
沒有了內心的煩躁與焦慮,自己反而能夠靜心地把錯誤的信息想了又想,推測各種可能的原因。加上之前的種種嘗試的失敗,基本斷定是web server容器的問題。上網查了一些資料,發現如果容器出現問題,確實會報此種錯誤。項目使用了spring boot的內嵌tomcat作為web server,那么很有可能是這個容器出現了問題。雖然Maven也加載了spring boot的tomcat包,但是不是這個包損壞或存在問題。在項目的pom文件,添加了以下代碼:
<code>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<version>1.5.2.RELEASE</version>
</dependency>
</code>
更新了Maven的依賴包,重新編譯運行,奇跡發生了,一切OK,內心真是有點小激動!
這不是一個大問題,但我還是想把它記錄下來,分享給以后可能遇到這個問題的朋友,節省他們的時間,早日實現人生巔峰的夢想_