2010-01-29 65 views
10

我想从蚂蚁运行一个java任务。我试图运行“org.apache.tools.ant.launch.Launcher”类。如果没有指定任何类名,我会继续收到“NoClassDefFoundError”。我也得到一个“ClassNotFoundException”以及显示消息“无法找到主类:。程序将退出”。这里的错误NoClassDefFoundError没有任何类名

[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 

现在我试图运行从蚂蚁罐子蚂蚁类的片断,我specifiy哪里该类文件驻留使用“classpathref”属性的类路径,但我仍然得到这个消息。我检查了ant jar来检查Manifest,并且正确指定了“main”类(它是“org.apache.tools.ant.launch.Launcher”)。我耗尽了所有资源。请帮忙 ! ! !

PS:我的环境是Eclipse的在Ubuntu 9.04

回答

0

从这一行:

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

它看起来好像你要调用的java.exe是找到一个.它需要一个类名。也许你试图在命令行中指明类路径,但是忽略前面的-cp-classpath标志。

+0

这里就是我在build.xml文件 Seagull 2010-01-29 00:27:32

+1

@Safder。也许你应该展示'webtest.lib'是如何定义的。 – 2010-01-29 12:34:14

1

这可能是一个误导性错误,实际上并不涉及类路径中缺少的类。如果您使用的是Tomcat,可能是因为缺少$ CATALINA_BASE/conf中的conf文件。它可能也是错误配置的ant安装,请检查您的JAVA_HOME和ANT_HOME env变量或尝试另一个ant安装。

5

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

在最低限度的CLASSPATH应包括:

  • 的ant.jar和蚂蚁launcher.jar
  • 瓶/类的XML解析器
  • JDK的所需的jar/zip文件

(来自ant manual

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

1

蚂蚁发射预计以下PARAMS

java -Dant.home=c:\ant org.apache.tools.ant.launch.Launcher [options] [target] 

我affraid我们不能继续回答你,如果你不贴你的整个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

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任务?

0

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

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

如果我不得不做出胡乱猜测,我敢打赌,你的命令行看起来是这样的:

的Java ... -classpath org.apache.tools.ant.launch.Launcher

代替

的Java ... -classpath foo.jar中; bar.jar org.apache.tools.ant.launch.Launcher

像你预期

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,我可以再次回到这个工作状态。可能这会为某个人节省一些时间。

0

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