1. 程式人生 > >Tomcat - ClassFormatException的解決方法

Tomcat - ClassFormatException的解決方法

問題與分析

在使用Tomcat7執行web專案時報錯如下:

嚴重: Compilation error
org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException
at ....

仔細查看了報錯的堆疊資訊,發現基本說的都是無法編譯jsp的錯誤。百度了一番,才明白原來是因為Tomcat7和jdk8存在著不相容的情況。Tomcat通過ecj.jar來編譯jsp,這個ecj是Eclipse自己開發和使用的針對Java的編譯器。

ecj即the Eclipse Compiler for Java,Eclipse並沒有使用JDK自帶的編譯器,而是使用自己開發的ecj編譯器,而ecj也通過了java的驗證。除了Eclipse之外,Tomcat也用到了ecj,用於動態編譯jsp檔案,可以在Tomcat的lib目錄下找到該jar包。

而這個ClassFormatException,就是因為Tomcat7使用的ecj.jar版本比較低,裡邊使用的是較低版本的jdk,導致無法在jdk8的環境下去編譯jsp檔案。

解決方案

方案一

既然是Tomcat7和jdk8不相容導致的,那麼我們只要使用Tomcat8或者jdk7自然就沒這個問題了。如果希望還是使用Tomcat7和jdk8來執行專案,就需要使用方案二了。

方案二

將Tomcat7的lib目錄下的ecj.jar換成Tomcat8裡邊的ecj.jar,比如說將ecj3.7.2換成ecj.4.4.2,這樣就可以讓Tomcat7和jdk8相容了。如果你懶得去下載Tomcat8然後獲取裡邊的高版本ecj.jar,可以去Maven中央倉庫獲取對應版本的ecj.jar:

https://mvnrepository.com/artifact/org.eclipse.jdt.core.compiler/ecj

參考連結