問題與分析
在使用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