最近在做一些 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/
相關文章

Conversion to Dalvik format failed with error 1

(2015-01-05 更新) 最近小蛙想把照照明星臉的bug都修一修,結果在更新FacebookSDK的時候發生了「Conversion to Dalvik format failed with error 1」這種搞不清楚發生什麼事情的
2012-01-04 18:00:50
hans

18

SSL For Free – 免費又有綠色鎖頭的 SSL Certificates

之前聽說 Google 會優先搜尋有 https 的網頁 (參考:
2016-07-07 23:00:54
hans

8

Android Vuforia with jPCT-AE (5) – 多重模型載入,以 obj 為例

要進到這系列最後一篇文章了,這篇文章拖了很久,一直沒有時間整理,結果到最後 ... 程式碼留下來了,記憶卻有些模糊了,這邊小蛙配著程式碼盡可能的把還記得的東西寫下來。
2016-07-06 11:24:19
hans

8

Android Vuforia with jPCT-AE (4) – 載入 3DS 測試

延續 jPCT-AE Loader 載入模型的部份,這篇要記錄載入 3ds 檔案格式的方法,基本上跟前面幾個 obj, md2 的方法差不多,只有一些小小的變化而已。
2016-07-06 10:24:33
hans

8

Android Vuforia with jPCT-AE (3) – 載入 md2 測試

前兩篇介紹如何直接透過 jPCT-AE 直接繪圖以及載入 .obj 檔案,這邊繼續介紹 jPCT-AE 載入 md2 的方法,載入動作大致上類似,唯一不同的只有 texture 設定部份。
2016-07-06 09:24:43
hans

8

Android Vuforia with jPCT-AE (2) – 載入 obj 測試

上一篇 Android Vuforia with jPCT-AE (1) –
2016-07-06 08:24:55
hans

8

Android Vuforia with jPCT-AE (1) – 基本範例

說來慚愧,從 Google Adsense 被 ban 之後,就好久沒有發文了,站上 Vuforia 的文章也已經是好久以前的事情了 (遠目),最近有專案要用到 Vuforia,爬以前的文回來看,蛙哩咧 ... 現在已經更新到 Vu
2016-07-06 07:57:58
hans

8

ClickForce (MobiForce) 當機問題

這真是個浪費時間又漫長的過程,CF 推出新版後台以及新版 SDK 的時候,小蛙就下載來測試,一開始小蛙直接套在「我的股票精算師」上,但只要一套上去就當機 ...
2015-09-02 10:32:51
hans

8

我的股票精算師備份功能

常遇到使用者詢問「我的股票精算師」要怎麼備份,這篇記錄一下,需要寫怎麼備份表示軟體設計上有很大的問題,造成使用者使用上的困難,但小蛙最近沒有時間去做修改 ... 只好委屈精算師的使用者了 ><
2015-02-06 18:32:07
hans

8




 回覆

你可以使用以下語法 HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="">

(required)

(required)

   
© 2012 蛙齋 Suffusion theme by Sayontan Sinha