java.lang.UnsupportedClassVersionError: Unsupported major.minor version 51.0
最近在做一些 struts2 的佈署,之前都是在 Windows 下進行,這次要佈署到遠端機器,OS 不同以及環境不同常造成一些怪異問題,這裡記錄一下如果遇到「java.lang.UnsupportedClassVersionError」這個問題的解決方案!
在網路上查了一下,會造成這個原因是兩邊的 Java 版本不符,小蛙開發機上的 Java 是選擇 1.7,而遠端機器 Ubuntu 上面只有 Java 1.6,把整個 Struts2 專案的 war 丟進去之後就跑出以下這個錯誤:
2013/10/17 上午 11:05:44 org.apache.catalina.core.StandardContext filterStart 嚴重的: Exception starting filter struts2 java.lang.UnsupportedClassVersionError: aaa/bbb/action/LoginAction : Unsupported major.minor version 51.0 (unable to load class aaa.bbb.action.LoginAction) at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2824) at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1150) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1645) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1523) at com.opensymphony.xwork2.util.ClassLoaderUtil.loadClass(ClassLoaderUtil.java:144) at com.opensymphony.xwork2.ObjectFactory.getClassInstance(ObjectFactory.java:108) at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.verifyAction(XmlConfigurationProvider.java:472) at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.addAction(XmlConfigurationProvider.java:426) at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.addPackage(XmlConfigurationProvider.java:543) at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.loadPackages(XmlConfigurationProvider.java:292) at org.apache.struts2.config.StrutsXmlConfigurationProvider.loadPackages(StrutsXmlConfigurationProvider.java:112) at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:250) at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:67) at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:429) at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:473) at org.apache.struts2.dispatcher.ng.InitOperations.initDispatcher(InitOperations.java:74) at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.init(StrutsPrepareAndExecuteFilter.java:51) at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:273) at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:254) at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:372) at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:98) at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4584) at org.apache.catalina.core.StandardContext$2.call(StandardContext.java:5262) at org.apache.catalina.core.StandardContext$2.call(StandardContext.java:5257) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) at java.util.concurrent.FutureTask.run(FutureTask.java:138) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:662)
解決方法是在 Eclipse -> Project -> Properties -> Java Compiler -> Compiler compliance level 1.6 這裡設定成符合的版本即可,但還是要注意不管是 1.6 or 1.7 如果有使用到特定版本的寫法,可能會出現一些錯誤喔!比較好的方法是讓本機端跟遠端不管是 JDK 或 Tomcat 版本一致才是上策。(參考資料2)
小蛙透過上面的方法設定不同版本的 JDK 後,Project -> Clean 選擇剛剛變更過的專案,卻發生下面的錯誤:
Java compiler level does not match the version of the installed Java project facet. Faceted Project Problem (Java Version Mismatch)
什麼是 Eclipse Project Facet?(from 參考資料1 : Eclipse Project Facet 功能 @ 昭佑.天翔)
Project Facets 只要是方便你 “快速擴充套件” 與 “控管套件版本”,
只要你在 Project Facets 勾選要擴充的套件,
Eclipse 會自動幫你將相關套件加入到 Java Build Path / Web App Libraries (也就是 WEB-INF/lib) 目錄中.
上面的錯誤是因為我們調整的 Java Compiler 的版本,但是卻跟 Project Facet 設定的不一樣造成的,這邊只要到
Project -> Properties -> Project Facets -> Java -> 1.6 設定成跟剛剛的 Compiler compliance level 相同即可!
參考資料:
- Eclipse Project Facet 功能 @ 昭佑.天翔
http://tomkuo139.blogspot.tw/2012/01/eclipse-project-facet.html - Eclipse: java.lang.UnsupportedClassVersionError: Bad version number in .class file
http://www.programcreek.com/2010/05/java-lang-unsupportedclassversionerror-bad-version-number-in-class-file/