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 以检查 Manifest,并且正确指定了“主”类(它是“org.apache.tools.ant.launch.Launcher”)。我已经用尽了我所有的资源。请帮忙 !!!

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

4

8 回答 8

6

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

CLASSPATH 至少应包括:

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

(来自蚂蚁手册

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

于 2010-05-21T22:09:47.707 回答
4

看起来 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物业中有空间?

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

于 2010-06-19T10:14:16.010 回答
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,我就可以让它再次工作。也许这可以节省一些严重的有时间了。

于 2012-12-01T20:39:58.340 回答
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>

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

希望这可以帮助,

埃尔纳尼

于 2010-05-22T07:16:29.340 回答
1

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

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

于 2010-05-20T10:15:43.057 回答
0

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

于 2013-04-18T12:29:14.263 回答
0

从这一行:

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

看起来好像您对 java.exe 的调用正在寻找.它需要类名的位置。也许您正试图在命令行上指示类路径,但忽略了以-cpor-classpath标志开头。

于 2010-01-29T00:20:29.493 回答
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

如你所料

于 2010-06-24T23:18:07.863 回答