NoClassDefFoundError без какого-либо имени класса - PullRequest
10 голосов
/ 29 января 2010

Я пытаюсь запустить задачу Java из муравья. Я пытаюсь запустить класс "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", однако я все еще получаю это сообщение. Я проверил jar муравья, чтобы проверить Manifest, и класс "main" указан правильно (это "org.apache.tools.ant.launch.Launcher"). Я исчерпал все свои ресурсы. Пожалуйста помоги ! ! !

ps: моя среда - Eclipse в Ubuntu 9.04

Ответы [ 8 ]

5 голосов
/ 22 мая 2010

Скорее всего, ваш путь к классам неверно настроен.

Как минимум, CLASSPATH должен включать:

  • ant.jar и ant-launcher.jar
  • банок / классов для вашего анализатора XML
  • необходимые jar / zip файлы JDK

(из руководства ant )

Также вы, похоже, перезапускаете ant в текущем каталоге (выполняя тот же build.xml). Может быть, вы захотите установить свойство "dir".

4 голосов
/ 19 июня 2010

Похоже, что задача 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, но я не думаю, что это имеет большое значение.)

Могу только предложить продолжение комментария Александра Погребняка к ответу АКФ. Возможно, свойство webtest.lib содержит пробелы?

Кроме того, есть ли веская причина для вызова ant напрямую через java вместо использования задачи ant ?

3 голосов
/ 02 декабря 2012

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

1 голос
/ 22 мая 2010

Модуль запуска Ant ожидает следующие параметры

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>

Это было бы чрезвычайно полезно, чтобы дать вам возможное недоразумение.

Надеюсь, это поможет,

Эрнани

1 голос
/ 20 мая 2010

Это может быть ошибочной ошибкой, которая не связана с отсутствием класса в пути к классам. Если вы используете Tomcat, это может быть связано с отсутствием файлов conf в $ CATALINA_BASE / conf

Это также может быть неправильно настроенная установка ant, проверьте переменные env JAVA_HOME и ANT_HOME или попробуйте другую установку ant.

0 голосов
/ 18 апреля 2013

У меня недавно была похожая проблема. Виновными были 2 тега в java-задаче, для которых не были установлены значения, поэтому они привели к двум пустым аргументам команды и в итоге к двум пробелам в командной строке. По какой-то причине Unix не справляется с этим правильно. И Red Hat 5, и Ubuntu отображали одинаковую ошибку. Это было нормально на Windows 7. Установка в этих аргументах фиктивных значений по умолчанию решила проблему.

0 голосов
/ 25 июня 2010

Если есть сомнения, вызовите ant -v и просмотрите все объявления переменных и всю командную строку, отправленную на Java.

Определенные траектории количества с нетерпением оцениваются, в то время как другие лениво оцениваются. У меня было много проблем, когда я использовал одну из первых, когда мой Ant-скрипт намеревался создать банку, которая будет использоваться в более поздней задаче. К тому времени, когда я вызвал вызов, он уже убрал мою банку из пути к классам.

Если бы мне пришлось делать дикие предположения, я бы поспорил, что ваша командная строка выглядела примерно так:

java ... -classpath org.apache.tools.ant.launch.Launcher

вместо

java ... -classpath foo.jar; bar.jar org.apache.tools.ant.launch.Launcher

как ты и ожидал

0 голосов
/ 29 января 2010

Из этой строки:

[java] Could not find the main class: .  Program will exit.

похоже, что ваш вызов java.exe находит ., где он ожидает имя класса. Возможно, вы пытаетесь указать путь к классу в командной строке, но пренебрегаете вводом с флагом -cp или -classpath.

...