Ошибка Ant: исключение в потоке «main» java.lang.NoClassDefFoundError org/apache/tools/ant/launch/Launcher

Я на 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, которые можно легко переключать?

Любая помощь приветствуется.


person Ameer Jewdaki    schedule 28.02.2013    source источник


Ответы (3)


Вам не хватает банки на пути к классам. Убедитесь, что у вас есть все необходимые библиотеки в папке lib, из которой ant извлекает зависимости.

Проверьте этот похожий вопрос.

person Community    schedule 28.02.2013
comment
Это нормально, что у меня нет JAVA_ & ANT_HOME? Может ли альтернативная система полностью устранить необходимость в этих переменных? - person Ameer Jewdaki; 28.02.2013
comment
Я не уверен, как вы настроили, но я бы оставил их там, потому что они используются не только для вашего приложения. - person ; 28.02.2013
comment
Спасибо, приятель, как я могу проверить путь к классам для вызова муравья? Где это находится? - person Ameer Jewdaki; 28.02.2013
comment
Нет-нет, я знаю, как установить путь к классам в файле сборки ant. Мне кажется, что сам муравей - это класс java, который загружается для понимания файла build.xml. И, как вы предположили, класс загружается с неправильным путем к классам, поэтому основной класс не найден. Итак, мой вопрос: где задан путь к классам для запуска ant? - person Ameer Jewdaki; 28.02.2013
comment
Путь к классам ant — это путь, по которому вы установили ant? вы можете установить его в папку bin вашей установки... - person ; 28.02.2013
comment
давайте продолжим это обсуждение в чате - person Ameer Jewdaki; 28.02.2013

Я могу ответить только на последний вопрос.

МЫ НЕ ИСПОЛЬЗУЕМ АЛЬТЕРНАТИВНУЮ СИСТЕМУ, вместо этого мы управляем ею вручную.

Как в Ubuntu, так и в CentOS мы всегда используем файл tar.gz с веб-сайта Oracle JDK, извлекаем его в подпапку в /opt (например, /opt/jdk_1.7.0_09), делаем символьную ссылку на папку (например, /opt/default_jdk -> /opt/jdk_1.7.0_09) и устанавливаем переменные среды, где мы указываем JAVA_HOME на ссылку символа, а не на фактическую папку (JAVA_HOME=/opt/default_jdk).

Таким образом, если мы хотим изменить или обновить jdk (например, с JDK 7 upadte 9 на JDK 7 upadte 15), мы просто загружаем пакет tar.gz, извлекаем его в другую папку (например, /opt/jdk_1.7.0_15), удаляем старый символ ссылку (указывающую на /opt/jdk_1.7.0_09) и создайте новую, указывающую на новую папку (например, /opt/default_jdk -> /opt/jdk_1.7.0_15).

Точно так же работает с 32- и 64-битными jdks, разными версиями Ant, Maven, Gradle и т. д.

person coolcfan    schedule 11.03.2013
comment
это не только java, javac, javaws, jar и т.д. Они все в JAVA_HOME. Я думаю, что должен быть лучший способ. - person Ameer Jewdaki; 13.03.2013
comment
Что вы подразумеваете под переключением версии Java? В нашем повседневном использовании это означает использование другой версии JDK. И единственное, что мы устанавливаем в наших системах о JDK, это JAVA_HOME и добавление $JAVA_HOME/bin к PATH. Мы никогда не используем альтернативную систему дистрибутива Linux, так как мы всегда используем Oracle JDK и остаемся с его пакетом tar.gz. - person coolcfan; 13.03.2013
comment
всякий раз, когда вы хотите переключаться между версиями, вы должны переключать все эти символические ссылки между фактическими и символическими jar, java, javac, javaw, javadoc и т. д. Если я прав, я полагаю, что это не очень удобный способ. - person Ameer Jewdaki; 13.03.2013
comment
Что мы сделали, так это просто сделали символьную ссылку на папку jdk и указали JAVA_HOME на символьную ссылку вместо фактической папки. Мы НИКОГДА не создаем символьные ссылки для ИСПОЛНЯЕМЫХ ФАЙЛОВ. - person coolcfan; 13.03.2013
comment
О, я понял. Спасибо друг. - person Ameer Jewdaki; 13.03.2013
comment
Даже если вы хотите создать некоторые символьные ссылки в таких местах, как /usr/bin, чтобы сделать определенные исполняемые файлы доступными в SSH (SSH не читает ~/.profile), вы просто указываете символьную ссылку на путь, например /opt/default_jdk/bin/java — при переключении между разными версиями. , вам все равно нужно просто удалить ссылку символа default_jdk и создать новую. Не беспокойтесь, система достаточно умна, чтобы следовать нескольким уровням ссылок символов. - person coolcfan; 13.03.2013

Похоже, что-то не так с вашей установкой Java. Обратитесь к этому http://www.linuxforums.org/forum/red-hat-fedora-linux/151698-problems-tomcat.html с аналогичной проблемой, которая была решена позже.

person Navin Mishra    schedule 14.03.2013