вторник, 10 ноября 2015 г.

Unsupported major.minor version

Порой при запуске java класса/jar/приложения и т.д. можно "словить"
java.lang.UnsupportedClassVersionError: название класса :
 Unsupported major.minor version 51.0
Причина заключается в том, что класс был скомпилирован на версии jdk более новой, чем та, на которой этот класс теперь запускается. Например, скомпилирован на 1.7, а запускается на 1.6 и т.п.

Узнать текущую версию jdk можно консольной командой java -version

А вот как определить, какой версии class-файл? Узнать версию jdk, использованную при компиляции, можно по числу в описании ошибки (51, 50 и т.п.) или по самому class-файлу. Любой класс имеет определённую структуру (детали - в документации по его формату, например, https://docs.oracle.com/javase/specs/jvms/se6/html/ClassFile.doc.html#80959). В частности, начало выглядит примерно так:
CA FE BA BE 00 00 00 2E
Файл начинает с magic number CAFEBABE, а за ним следуют два short-а, составляющие minor и major части версии соответственно.
Поэтому можно открыть class-файл в hex-редакторе, найти значение и определить версию по следующей таблице: