Я на Fedora 17. Я пытаюсь скомпилировать проект с файлом сборки ant, который несовместим с Java 7. Поэтому я решил установить OpenJDK 6. JDK 6, к сожалению, удален из репозиториев yum, и я подумал, что это будет легко установить вручную. Я узнал, что нет переменной JAVA_HOME и вместо нее используется система альтернатив. Итак, я загрузил двоичные файлы OpenJDK (из OSG, если это имеет значение) и установил java, javac и javaws с помощью команды alternatives --install
. Проверка java --version
и javac --version
оказалась успешной. Но случилось странное, что муравей больше не работает! Когда я набираю ant --execdebug
, я получаю это сообщение:
exec "/usr/lib/jvm/openjdk-6.0.24/bin/java" -classpath "/usr/bin/build-classpath:
error: JVM_LIBDIR /usr/lib/jvm-exports/openjdk-6.0.24 does not exist or is not a
directory:/usr/bin/build-classpath: error: JVM_LIBDIR /usr/lib/jvm-exports/openjdk-6.0.24
does not exist or is not a directory:/usr/lib/jvm/openjdk-6.0.24/lib/tools.jar"
-Dant.home="/usr/share/ant" -Dant.library.dir="/usr/share/ant/lib"
org.apache.tools.ant.launch.Launcher -cp ""
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/tools/ant/launch/Launcher
Caused by: java.lang.ClassNotFoundException: org.apache.tools.ant.launch.Launcher
at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
Could not find the main class: org.apache.tools.ant.launch.Launcher. Program will exit.
Как и в случае с java, здесь тоже нет переменной ANT_HOME. Но ANT_HOME не было даже до установки java 6, пока он работал нормально. Ant устанавливается в /usr/bin/ant, который уже находится в PATH.
ОБНОВЛЕНИЕ: я знаю, что есть похожие вопросы вопрос 1, вопрос 2. Но ни один не решил мою проблему. Например добавление ANT_HOME=/usr/bin ухудшает ситуацию, ведь ant не работает даже с JDK 7! Из-за моего незнания системы альтернатив я полностью удалил альтернативы, связанные с java, вместо этого добавил JAVA_HOME и изменил PATH. Опять же, java и javac работают нормально, java --version возвращает правильную версию, но ant возвращает ту же ошибку. Как говорит нам --execdebug
, JVM_LIBDIR указывает не на то место. Я предполагаю, что значение установлено в файле java.conf, поэтому я вставляю его сюда (я установил JDK 6 и 7 в /usr/lib/jvm):
# System-wide Java configuration file -*- sh -*-
#
# JPackage Project <http://www.jpackage.org/>
# Location of jar files on the system
JAVA_LIBDIR=/usr/share/java
# Location of arch-specific jar files on the system
JNI_LIBDIR=/usr/lib64/java
# Location for noarch jar files using arch-specifics jar files
JAVAJNI_LIBDIR=/usr/share/java-jni
# Root of all JVM installations
JVM_ROOT=/usr/lib/jvm
# You can define a system-wide JVM root here if you're not using the
# default one.
#
# If you have the a base JRE package installed
# (e.g. java-1.6.0-openjdk):
#JAVA_HOME=$JVM_ROOT/jre
#
# If you have the a devel JDK package installed
# (e.g. java-1.6.0-openjdk-devel):
#JAVA_HOME=$JVM_ROOT/java-1.7.0-openjdk-1.7.0.9.x86_64
JAVA_HOME=$JVM_ROOT/openjdk-6.0.24
# Options to pass to the java interpreter
JAVACMD_OPTS=
Просто комментируя и раскомментируя соответствующие строки в java.conf, получается, что ant работает нормально с 7 и не работает с 6. Когда я повторяю JVM_LIBDIR непосредственно перед командой java
в оболочке ant, я получаю user/share/java
, как указано в java.conf. Но ant --execdebug
вернул что-то странное: JVM_LIBDIR /usr/lib/jvm-exports/openjdk-6.0.24
. Что это такое и как я могу это исправить?
Если бы вы не могли описать проблему здесь, каков самый аккуратный и безопасный способ установить несколько версий JDK, которые можно легко переключать?
Любая помощь приветствуется.