没有任何类名的NoClassDefFoundError

时间:2010-01-29 00:13:26

标签: java ant noclassdeffounderror

我正在尝试从ant运行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 jar运行一个ant类,并使用“classpathref”属性指定此类文件所在的类路径,但是我仍然收到此消息。我检查了ant jar以检查Manifest并正确指定了“main”类(它是“org.apache.tools.ant.launch.Launcher”)。我已经用尽了所有的资源。请帮忙 ! ! !

ps:我的环境是Ubuntu 9.04上的Eclipse

8 个答案:

答案 0 :(得分:5)

您的类路径很可能配置错误。

CLASSPATH至少应该包括:

  • ant.jar和ant-launcher.jar
  • 用于XML解析器的jar / classes
  • JDK所需的jar / zip文件

(来自ant manual

此外,您似乎正在重新启动当前目录中的ant(执行相同的build.xml)。也许你想要设置“dir”属性。

答案 1 :(得分:4)

看起来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上,但我认为这并没有多大区别。)

我只能建议跟进Alexander Pogrebnyak对akf答案的评论。也许webtest.lib属性中有空格?

另外,是否有充分的理由通过java直接调用ant,而不是使用ant任务?

答案 2 :(得分: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,我可以再次使用它。可能这样可以为某人节省了一些时间。

答案 3 :(得分:1)

这可能是一个误导性错误,实际上并不是类路径中缺少的类。如果您使用的是Tomcat,可能是由于缺少$ CATALINA_BASE / conf

中的conf文件

它也可能是配置错误的ant安装,请检查您的JAVA_HOME和ANT_HOME env变量或尝试其他ant安装。

答案 4 :(得分:1)

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>

这对您提供可能的误解非常有帮助。

希望这有帮助,

Ernani

答案 5 :(得分:0)

从这一行:

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

看起来你对java.exe的调用正在找到一个.,它需要一个类名。也许您试图在命令行上指出类路径,但忽略了使用-cp-classpath标志的前言。

答案 6 :(得分:0)

如有疑问,请调用ant -v并观察所有变量声明,并将整个命令行发送给Java。

急切地评估某些类似路径的数量,而其他数量则被懒惰地评估。当我的Ant脚本打算创建一个将在以后的任务中使用的jar时,我遇到了很多问题。然后,当我调用该调用时,它已经从类路径中修剪了我的jar。

如果我不得不猜测,我敢打赌你的命令行看起来像是:

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

而不是

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

就像你期望的那样

答案 7 :(得分:0)

我最近遇到了类似的问题。罪魁祸首是java任务下的2个标签,没有设置它们的值,因此它们导致2个空命令参数,最后在命令行中的2个空格中。 由于某种原因,Unix没有正确处理它。 Red Hat 5和Ubuntu都显示相同的错误。在Windows 7上没问题。 将这些参数设置为具有默认虚拟值可以解决问题。