最近在做一些 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 相同即可!

參考資料:

  1. Eclipse Project Facet 功能 @ 昭佑.天翔
    http://tomkuo139.blogspot.tw/2012/01/eclipse-project-facet.html
  2. 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/

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *