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. Установка этих аргументов для значений фиктивных значений по умолчанию решила проблему.