没有任何类名的NoClassDefFoundError

10

我试图从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包的清单,"main"类已经正确地指定为"org.apache.tools.ant.launch.Launcher"。我已经耗尽了所有的资源,请帮帮我!!!
附注:我的环境是Ubuntu 9.04上的Eclipse
8个回答

6
很可能您的类路径配置有误。
至少,CLASSPATH应包括:
- ant.jar和ant-launcher.jar - 您的XML解析器的jars/classes - JDK所需的jar/zip文件
(来自ant手册
此外,您似乎在当前目录中重新启动了ant(执行相同的build.xml)。也许您想设置“dir”属性。

4
看起来Ant任务正在尝试运行Java,但以某种方式将空字符串作为要运行的类的名称传递给了JVM。如果我直接使用带引号的空字符串运行JVM,我可以得到相同的堆栈跟踪:(这是在Windows上,但我认为这没有太大的区别。)我只能建议跟进Alexander Pogrebnyak对akf答案的评论。也许webtest.lib属性中有空格?

另外,直接通过Java调用ant而不是使用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,我就可以重新使其工作。也许这可以为某些人节省一些严重的时间。


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


1

这可能是一个误导性的错误,实际上并不是关于类路径中缺少类的问题。如果您正在使用Tomcat,则可能是由于$CATALINA_BASE/conf中缺少conf文件引起的。

这也可能是一个配置不正确的ant安装问题,请检查您的JAVA_HOME和ANT_HOME环境变量或尝试另一个ant安装。


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

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

就像你期望的那样


0

从这一行开始:

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

看起来你调用 java.exe 时在期望类名的位置找到了一个 .。也许你试图在命令行上指定 classpath,但是忘记在前面加上 -cp-classpath 标志。


这是我在 build.xml 文件中的内容:<java classname="org.apache.tools.ant.launch.Launcher" classpathref="webtest.lib" jvm="${javahome.dir}/bin/java" fork="true" failonerror="false"> - Seagull
1
@Safder。也许你应该展示一下 webtest.lib 是如何定义的。 - Alexander Pogrebnyak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接