Ошибка Java: неверный номер версии в ошибке .class при попытке запустить Cassandra на OS X

Я пытаюсь заставить Cassandra работать с OS X. Когда я запускаю bin/cassandra, я получаю следующую ошибку:

~/apache-cassandra-incubating-0.4.1-src > bin/cassandra -f
Listening for transport dt_socket at address: 8888
Exception in thread "main" java.lang.UnsupportedClassVersionError: Bad version number in .class file
 at java.lang.ClassLoader.defineClass1(Native Method)
 at java.lang.ClassLoader.defineClass(ClassLoader.java:675)
 at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
 at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
 at java.net.URLClassLoader.access$100(URLClassLoader.java:56)
 at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
 at java.security.AccessController.doPrivileged(Native Method)
 at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:316)
 at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:280)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
 at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:374)

Из того, что я смог определить путем поиска, эта ошибка связана с несовместимыми версиями Java. Однако, насколько я могу судить, у меня есть последняя версия Java:

    ~/apache-cassandra-incubating-0.4.1-src > java -version
    java version "1.6.0_13"
    Java(TM) SE Runtime Environment (build 1.6.0_13-b03-211)
    Java HotSpot(TM) 64-Bit Server VM (build 11.3-b02-83, mixed mode)
    ~/apache-cassandra-incubating-0.4.1-src > javac -version
    javac 1.6.0_13
    ~/Downloads/apache-cassandra-incubating-0.4.1-src > echo $JAVA_HOME
    /System/Library/Frameworks/JavaVM.framework/Versions/1.6/Home

Любые идеи о том, что я делаю неправильно?

Ответ 1

Плохой номер версии почти всегда, потому что вы скомпилировали свой файл java в файл класса с одной версией и пытаетесь запустить его с более ранней версией.

Вы должны быть уверены, что эта "кассандра" использует версию Java, которую вы так считаете. Это не обязательно использует тот же самый, который вы получаете при запуске java из командной строки.

Ответ 2

Если вы используете maven в pom.xml, так он будет скомпилирован на 1.5, даже если u использует 1.6

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
      <source>1.5</source>
      <target>1.5</target>
      <debug>true</debug>
    </configuration>
  </plugin>

Ответ 3

В cassandra/bin в файле cassandra.in.sh добавьте следующие две строки в нижней части файла:

JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home
JAVA=/System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Commands/java

Этого будет достаточно, чтобы запустить bin/cassandra. Чтобы заставить другие скрипты оболочки работать с этим вам может понадобиться патч 590 и исправить другие сценарии оболочки, чтобы использовать переменные JAVA_HOME и JAVA.