Java: Unsupported major.minor version 51.0

Автор: | 02/04/2014
 

java-logoПри установке плагина для TeamCIty в логе появилась запись с такой ошибкой:

[2014-02-03 18:27:46,309]  ERROR - gins.spring.SpringPluginLoader - Failed to initialize spring context for plugin piazza
org.springframework.beans.factory.CannotLoadBeanClassException: Error loading class [com.natpryce.piazza.projectConfiguration.PiazzaProjectSettingsFactory] for bean with name 'piazzaProjectSettingsFactory' defined in plugin: piazza#team-
piazza-server-1.0-SNAPSHOT.jar!/META-INF/build-server-plugin.xml: problem with class file or dependent class; nested exception is java.lang.UnsupportedClassVersionError: com/natpryce/piazza/projectConfiguration/PiazzaProjectSettingsFacto
ry : Unsupported major.minor version 51.0
at org.springframework.beans.factory.support.AbstractBeanFactory.resolveBeanClass(AbstractBeanFactory.java:1253)

Проблема возникла из-за  того, что при компиляции и создании jar-файла использовалась Java более новой версии, чем используется на сервере. Таблица соответствия форматов файлов и версии Java:

J2SE 7 = 51 (0x33 hex),
J2SE 6.0 = 50 (0x32 hex),
J2SE 5.0 = 49 (0x31 hex),
JDK 1.4 = 48 (0x30 hex),
JDK 1.3 = 47 (0x2F hex),
JDK 1.2 = 46 (0x2E hex),
JDK 1.1 = 45 (0x2D hex).

Проверяем текущую версию Java на сервере:

$ java -version
java version "1.6.0_24"
OpenJDK Runtime Environment (IcedTea6 1.11.13) (rhel-1.65.1.11.13.el6_4-x86_64)
OpenJDK 64-Bit Server VM (build 20.0-b12, mixed mode)

Решение — установить более новую версию Java. Т.к. текущая Java установлена глобально для сервера, и используется многими приложениями на на нём — мы установим новую Java только для нашего TeamCity. Качаем архив:

 Linux x64 44.73 MB jre-7u51-linux-x64.tar.gz

Копируем его в отдельную директорию этого пользователя:

$ mv jre-7u51-linux-x64.tar.gz /home/teamcity/opt

Распаковываем:

$ tar xfp jre-7u51-linux-x64.tar.gz
$ ls -l | grep jre
drwxr-xr-x  6 teamcity teamcity      4096 Dec 19 05:15 jre1.7.0_51
-rw-r--r--  1 teamcity teamcity  46904005 Feb  3 19:05 jre-7u51-linux-x64.tar.gz

Теперь — изменим переменную JRE_HOME для этого пользователя:

$ vim /home/teamcity/.bashrc
# оставляем старую JAVA_HOME
export JAVA_HOME=/usr/java/jdk1.6.0_45/
# и устанавливаем новую JRE_HOME
export JRE_HOME="/home/teamcity/opt/jre1.7.0_51"

Перечитаем файл .bashrc:

$ . /home/teamcity/.bashrc

Готово.