我正在尝试从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
答案 0 :(得分:5)
您的类路径很可能配置错误。
CLASSPATH至少应该包括:
(来自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上没问题。 将这些参数设置为具有默认虚拟值可以解决问题。