【问题标题】:NoClassDefFoundError without any class nameNoClassDefFoundError 没有任何类名
【发布时间】:2011-01-10 16:02:18
【问题描述】:

我正在尝试从 ant 运行 java 任务。我正在尝试运行“org.apache.tools.ant.launch.Launcher”类。我不断收到“NoClassDefFoundError”,但没有指定任何类名。我还收到“ClassNotFoundException”以及显示消息“找不到主类:。程序将退出”。这是错误的sn-p

 [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

【问题讨论】:

    标签: java ant noclassdeffounderror


    【解决方案1】:

    从这一行开始:

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

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

    【讨论】:

    • 这是我在 build.xml 中的内容
    • @Safder。或许您应该说明webtest.lib 是如何定义的。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      CLASSPATH 至少应包括:

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

      (来自ant manual

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

      【讨论】:

        【解决方案4】:

        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>
        

        这将非常有助于为您提供可能的误解。

        希望这会有所帮助,

        厄纳尼

        【讨论】:

          【解决方案5】:

          看起来 Ant 任务正在尝试运行 Java,但不知何故将一个空字符串作为要运行的类的名称传递给 JVM。如果我直接使用带引号的空字符串运行 JVM,我可以获得相同的堆栈跟踪:

          C:\>java "" 线程“主”java.lang.NoClassDefFoundError 中的异常: 引起:java.lang.ClassNotFoundException: 在 java.net.URLClassLoader$1.run(URLClassLoader.java:202) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.net.URLClassLoader.findClass(URLClassLoader.java:190) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:307) 在 sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:248) 无法找到主类: 。程序将会退出。

          (这是在 Windows 上,但我认为这没有太大区别。)

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

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

          【讨论】:

            【解决方案6】:

            如有疑问,请调用 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】:

              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,我就可以让它重新工作。也许这可能为某人节省一些重要的时间。

              【讨论】:

                【解决方案8】:

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-11-10
                  • 2016-10-04
                  • 2015-04-28
                  • 1970-01-01
                  • 2018-04-09
                  相关资源
                  最近更新 更多