NoClassDefFoundError без имени класса
Я пытаюсь запустить java-задачу из ant. Я пытаюсь запустить класс org.apache.tools.ant.launch.Launcher. Я продолжаю получать "NoClassDefFoundError" без указания имени класса. Я также получаю "ClassNotFoundException" вместе с отображением сообщения "Не удалось найти основной класс:" Программа выйдет ". Здесь фрагмент ошибки
[java] Exception in thread "main" java.lang.NoClassDefFoundError:
[java] Caused by: java.lang.ClassNotFoundException:
[java] at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
[java] at java.security.AccessController.doPrivileged(Native Method)
[java] at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
[java] at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
[java] at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
[java] at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
[java] at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
[java] Could not find the main class: . Program will exit.
[java] Java Result: 1
Теперь я пытаюсь запустить класс ant из ant jar и я указать путь к классам, в котором находится этот файл класса, используя атрибут classpathref, однако я все еще получаю это сообщение. Я проверил флажок ant, чтобы проверить манифест, и правильно задан класс "main" (он "org.apache.tools.ant.launch.Launcher" ). Я исчерпал все свои ресурсы. Пожалуйста помоги!!
ps: Моя среда Eclipse на Ubuntu 9.04
Ответы
Ответ 1
Скорее всего, ваш путь к классам неверно настроен.
Как минимум CLASSPATH должен включать:
- ant.jar и ant -launcher.jar
- jars/classes для анализатора XML
- JDK нужны файлы jar/zip
(из ant руководство)
Также вы, похоже, перезапускаете ant в текущем каталоге (выполняете тот же build.xml). Возможно, вы захотите установить свойство "dir".
Ответ 2
Похоже, задача Ant пытается запустить Java, но каким-то образом передает пустую строку JVM в качестве имени запускаемого класса. Я могу получить ту же стек, если я запускаю JVM напрямую с пустой строкой:
C:\>java ""
Exception in thread "main" java.lang.NoClassDefFoundError:
Caused by: java.lang.ClassNotFoundException:
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
Could not find the main class: . Program will exit.
(Это в Windows, но я не думаю, что это имеет большое значение.)
Я могу предложить только прокомментировать комментарий Александра Погребняка к ответу akf. Возможно, свойство webtest.lib
имеет в нем пробелы?
Кроме того, есть ли веская причина для вызова ant
напрямую через java, вместо использования ant задачи?
Ответ 3
https://blogs.oracle.com/sreekanth/entry/java_lang_noclassdeffounderror_org_codehaus
java.lang.NoClassDefFoundError: org/codehaus/plexus/classworlds/launcher/Launcher
By sreekanth on Nov 23, 2010
Недавно, когда я пытаюсь запустить некоторые скрипты Maven, я получаю это исключение:
Exception in thread "main" java.lang.NoClassDefFoundError: org/codehaus/plexus/classworlds/launcher/Launcher
Caused by: java.lang.ClassNotFoundException: org.codehaus.plexus.classworlds.launcher.Launcher
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
Could not find the main class: org.codehaus.plexus.classworlds.launcher.Launcher. Program will exit.
Потратив некоторое время на различные комбинации, я обнаружил, что это связано с тем, что у меня есть как M2_HOME, так и M3_HOME, установленные в моих переменных окружения. Когда я удалил M2_HOME из своих переменных окружения, я мог бы вернуть эту работу снова. Может быть, сохраните какое-то серьезное время для кого-то.
Ответ 4
Это может быть ошибочная ошибка, которая на самом деле не относится к классу, отсутствующему в пути к классам. Если вы используете Tomcat, это может быть из-за отсутствия файлов conf в $CATALINA_BASE/conf
Это также может быть неправильно сконфигурированная установка ant, проверьте свои переменные env_HOME и ANT_HOME или попробуйте установить еще одну ant.
Ответ 5
Ant launcher ожидает следующих параметров
java -Dant.home=c:\ant org.apache.tools.ant.launch.Launcher [options] [target]
Я боюсь, мы не сможем ответить на ваш вопрос, если вы не вставляете весь файл build.xml.
Просто попробуйте дать полный образец, как показано ниже:
<java
classname="org.apache.tools.ant.launch.Launcher"
fork="true"
failonerror="true"
dir="${sub.builddir}"
timeout="4000000"
taskname="startAnt"
>
<classpath>
<pathelement location="${ant.home}/lib/ant-launcher.jar"/>
</classpath>
<arg value="-buildfile"/>
<arg file="${sub.buildfile}"/>
<arg value="-Dthis=this"/>
<arg value="-Dthat=that"/>
<arg value="-Dbasedir=${sub.builddir}"/>
<arg value="-Dthe.other=the.other"/>
<arg value="${sub.target}"/>
</java>
Это было бы очень полезно, чтобы предоставить вам возможное недоразумение.
Надеюсь, что это поможет,
Эрнани
Ответ 6
Из этой строки:
[java] Could not find the main class: . Program will exit.
похоже, что ваш вызов java.exe находит .
, где он ожидает имя класса. Возможно, вы пытаетесь указать путь к классам в командной строке, но пренебрегаете предисловием с помощью флага -cp
или -classpath
.
Ответ 7
В случае сомнений вызовите ant -v и просмотрите все объявления переменных и всю командную строку, отправленную на Java.
Определенные значения, подобные путям, оцениваются, а другие оцениваются лениво. У меня было много проблем, когда я использовал один из первых, когда мой ant script предназначался для создания банку, который будет использоваться более поздней задачей. Затем к тому времени, когда я вызвал вызов, он уже обрезал мою банку из пути к классам.
Если бы мне пришлось угадать, я бы сказал, что ваша командная строка выглядит примерно так:
java... -classpath org.apache.tools.ant.launch.Launcher
вместо
java... -classpath foo.jar; bar.jar org.apache.tools.ant.launch.Launcher
как вы ожидали
Ответ 8
Недавно у меня была аналогичная проблема. Претендентами были 2 тега под задачей java, которые не установили их значения, поэтому они привели к двум пустым аргументам команды и, в конце концов, в 2 пробелах в командной строке.
По какой-то причине Unix не справляется с этим правильно. И Red Hat 5, и Ubuntu отображали ту же ошибку. Это было нормально в Windows 7.
Установка этих аргументов для значений фиктивных значений по умолчанию решила проблему.