Eclipse啟動項目正常,放到tomcat下單獨啟動就報錯的 一例


一個老的ssh的項目,進行二次開發(增加一些新功能)后,

 

首先用Eclipse中集成的Tomcat啟動沒有任何問題,但是把啟動后的webapps下得目錄放到 windows的普通tomcat下單獨啟動,居然啟動不起來

【直接訪問啟動完的Tomcat的8080端口號是沒問題的,但是加上項目路徑/dc2就會報錯

報錯如下:

注意:異常信息中開始部分即1那行代碼不要特別關注,貌似所有Tomcat中項目一開始就啟動不起來都會拋出這個異常,真正要參照異常找問題原因的是一次異常信息中的最后一個caused by后面的部分,也就是2那行,注意2那行中有個 dc2_3,而這個正是下面原因中 context標簽中配置的 dc2_3

 

原因:

各種折騰,發現,在windows下的Tomcat目錄conf下得配置文件 server.xml 中的最后部分,host標簽中多了一個這個標簽

<Context path="" docBase="。。。。。。。。。。 />
里面有個 eclipse的引用,直接把這行標簽刪掉,再次啟動,異常改變了。說明剛才的異常解決了。
===============================
上面異常的啟發
1、遇到任何異常信息,即使是自己沒見過的異常信息,一般都是 根據當前這段異常中最后一個 caused by 后面的內容,來檢索問題原因。
2、在有些版本的eclipse中,在eclipse中配置過的本地Tomcat,有可能會在本地Tomcat目錄下的server.xml配置文件中的host標簽中自動生成 <Context docBase=“xxx”的標簽,這時如果再把項目直接放到wabapps目錄下,直接從Tomcat的bin目錄啟動(不用Eclipse),那么就會出現啟動不起來,報錯的情況。

==============================================

啟動后還是報錯,現在的異常是有兩處報:

Unsupported major.minor version 52.0解決辦法

根據上面鏈接,找到解決辦法為修改 eclipse中當前項目的三處jdk版本為統一的較低版本,但是修改過程中又報錯:
 

Project facet jst.web.jstl has not been defined.

解決方法,參見上文。
原來項目最早用的是jdk1.6,現在環境是1.8,出現了這個異常,故Eclipe當前項目的三處都修改為1.7后問題解決


然后,終於,項目可以在 windows 的 獨立 Tomcat中正常啟動了。

===========================================================================

現在是項目可以在Eclipse及本地Tomcat中正常運行,但是將其拷貝到Linux中運行,就會報錯
【直接訪問啟動完的Tomcat的8080端口號也是沒問題的,但是加上項目路徑/dc2就會報錯】


查看日志,報錯如下:

 【同樣,第一行異常信息不用管,Tomcat啟動項目報錯基本都會拋這個異常,重點看 caused by后的內容

 

java.lang.NoClassDefFoundError: org/springframework/core/env/ConfigurableEnvironment

各種百度,均不能解決問題,但根據百度信息可以推斷出很大可能是 spring的jar包有問題

后來同事找到解決方法:

刪除項目中的一個 spring jar包:

問題解決。

 =========================================================

 

原因分析

項目是個老項目,沒有用maven管理jar包,除了常規依賴外,其他jar包都是放在 WEB-INF的lib目錄下:

我們看到,實際上,項目中有兩個 spring-context jar包,可能導致了沖突

下面這個jar是5.0版本的,而其它spring相關jar都是3.0版本的。

 

其實是因為同事增加了一個定時任務的功能,在定時任務功能的代碼中用到了一個注解:

就是這個注解,據說它是 spring-context 4.0以上jar包中才有的,因為報錯,所以同事引入了 spring-contxt 5.0 的jar包,但是5.0的jar包中可能需要依賴spring core等其他spring高版本的jar包,而我們項目中其他所有的spring jar包都是 3.0版本的,而且有兩個contxt jar,這些都有可能導致了

 ConfigurableEnvironment 異常的發生。

 

所以,臨時解決辦法就是,刪掉 spring-contxt 5.0 的jar包,同時注釋掉報錯的代碼及其關聯代碼:

 =============================================

上面異常啟發

如果遇到在Eclipse和本地Tomcat獨立啟動項目兩種方式都沒有問題,但是部署到linux系統中就會啟動項目報錯的現象

1、首先 檢查項目中是否有關於linux的特殊配置或代碼,如果各個地方都沒有問題,那么就可以考慮

2、是否是jar包的問題(比如jar包冗余、沖突、互相不匹配等),根據上面的例子就可以猜測出,linux下Tomcat啟動項目和windows中啟動項目加載jar包的方式(或者說代碼中調用/檢查各個jar包依賴的方式)兩者可能是有細微區別的,這就有可能導致上述異常發生。

3檢查項目中jar包問題(冗余、沖突、互相不匹配等),首先要從特殊的jar包開始

  a、比如原來項目沒有這個問題,現在有了,那么就優先考慮最近引入的jar包(最近引入的功能代碼等)。
    eg:本例子就是,原來是沒有這個問題的,正是由於最近加入了定時任務新功能而且引入了jar包,才導致這個問題。
  b、還可以檢查某一類jar包的版本號,從最特殊的版本號開始。
    eg:本例也是,從lib目錄中jar包截圖可以看出,所有關於spring的jar包幾乎都是3.0的,只有一個是5.0,所以5.0這個就是相對特殊的,是重點要排查的【排查方式很簡單:先干掉它啟動試試即可】。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM