[存疑] JVMCFRE003 bad major version, offset=6

今天Deploy靜態資源包到咱們Production環境, package中只涉及到靜態資源文件, 例如數據庫鏈接信息, SQL查詢語句等. 成功部署後, 啓動服務報錯以下:java

Exception in thread "main" java.lang.UnsupportedClassVersionError: JVMCFRE003 bad major version; class=support/operations/gtm/iosbackendmanager/BackendManager, offset=6
    at java.lang.ClassLoader.defineClassImpl(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:324)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:155)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:715)
    at java.net.URLClassLoader.access$400(URLClassLoader.java:94)
    at java.net.URLClassLoader$ClassFinder.run(URLClassLoader.java:1169)
    at java.security.AccessController.doPrivileged(AccessController.java:492)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:598)
    at java.lang.ClassLoader.loadClassHelper(ClassLoader.java:777)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:750)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:341)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:731)
    at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:495)
</verbosegc>

通過分析和排查, 咱們認爲是本地RAD(eclipse的一種)的JDK level問題, server上java版本是1.7, Ant打包涉及的source和target均是1.7, 但本地RAD的JDK編譯版本是1.8, 將其改成1.7, 打包部署後, 進程正常啓動.ios


對這個問題, 網絡上廣泛的說法是"是由於咱們使用高版本的JDK編譯的Java class文件試圖在較低版本的JVM上運行" , 因此解決辦法一般都是更改本地JDK編譯環境, 很典型的例子是這個: UnsupportedClassVersionError: JVMCFRE003 bad major version in WebSphere AS 7 . 但在這個case裏, 我deploy的部分不涉及任何已編譯的class.因此在此存在兩個疑問:web

  1. offset=6是什麼意思?
  2. JDK編譯環境版本是否會影響靜態資源的編譯?

這也是第一次使用自動化打包和部署工具(UCD)來部署這一部分. 由於是生產環境, 因此在作這個Change以前仍是比較緊張的, 預想的問題主要有兩個:
1, Deploy process問題, 2, 靜態資源亂碼問題.
第一個確實出了一點故障, 沒有bin路徑的改動, 但在process的步驟裏沒有選擇"allow failure", 因此在複製bin文件夾時會報文件夾爲空的錯並中止運行. 選上allow failure便可.
2, 亂碼問題是一如既往, 而這個版本的更改中更是涉及到了有currency符號: "¤". 因此只能文件以東歐編碼ISO-8859-2形式保存. 這還須要更多的調查, 源碼對於utf8和其餘格式編碼的處理邏輯.
此次是預想的問題都沒有發生, 反而出現奇奇怪怪的問題, 搞的你們都很緊張, 好在問題已經解決. 不過還須要更多的調查. 數據庫

how to check the jdk version used to compile a .class file - duplicate網絡

相關文章
相關標籤/搜索