[英]Apache Ant java.lang.NoClassDefFoundError
可能的答案堆栈溢出问题
我的问题与上述线程中描述的相同。我经历了解决方案但它不起作用。 蚂蚁编译工作完美。 ant jar说不能加载主类
Exception in thread "main" java.lang.NoClassDefFoundError: LoadServer (wrong name: org/module/loader/LoadServer)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:791)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449)
at java.net.URLClassLoader.access$100(URLClassLoader.java:71)
at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:482)
我在命令行中执行了以下操作
JAVA_HOME="/usr/local/java/jdk1.7.0_21"
ANT_HOME="/usr/share/ant/"
PATH="$ANT_HOME/bin:$PATH"
此外,如果我启动一个新终端并输入echo$JAVA_HOME ,它会显示上述结果,但echo$ANT_HOME给出的是空值。
初始错误
<project name="Raxa-4" basedir="." default="main">
<property name="src.dir" value="src"/>
<property name="prop.dir" value="properties"/>
<property name="resource.dir" value="resource"/>
<property name="lib.dir" value="lib"/>
<property name="build.dir" value="build"/>
<property name="classes.dir" value="${build.dir}/classes"/>
<property name="jar.dir" value="${build.dir}/jar"/>
<property name="main-class" value="org.raxa.module.loader.LoadServer"/>
<path id="classpath">
<fileset dir="${lib.dir}" includes="**/*.jar"/>
</path>
<target name="clean">
<delete dir="${build.dir}"/>
</target>
<target name="compile">
<mkdir dir="${classes.dir}"/>
<javac srcdir="${src.dir}" destdir="${classes.dir}" classpathref="classpath" includeantruntime="false" />
<copy todir="${classes.dir}">
<fileset dir="${resource.dir}" excludes="**/*.java"/>
<fileset dir="${prop.dir}" excludes="**/*.java"/>
</copy>
</target>
<target name="jar" depends="compile">
<mkdir dir="${jar.dir}"/>
<classpath>
<path refid="classpath"/>
<path location="${jar.dir}/${ant.project.name}.jar"/>
</classpath>
</jar>
</target>
<target name="run" depends="jar">
<java jar="${jar.dir}/${ant.project.name}.jar" fork="true"/>
</target>
<target name="clean-build" depends="clean,jar"/>
<target name="main" depends="clean,run"/>
</project>
编辑:
<property name="src.dir" value="src"/>
<property name="prop.dir" value="properties"/>
<property name="resource.dir" value="resource"/>
<property name="lib.dir" value="lib"/>
<property name="build.dir" value="build"/>
<property name="classes.dir" value="${build.dir}/classes"/>
<property name="jar.dir" value="${build.dir}/jar"/>
<property name="main-class" value="org.raxa.module.loader.LoadServer"/>
<path id="classpath">
<fileset dir="${lib.dir}" includes="**/*.jar"/>
</path>
<target name="clean">
<delete dir="${build.dir}"/>
</target>
<target name="compile">
<mkdir dir="${classes.dir}"/>
<javac srcdir="${src.dir}" destdir="${classes.dir}" classpathref="classpath" includeantruntime="false" />
<copy todir="${classes.dir}">
<fileset dir="${resource.dir}" excludes="**/*.java"/>
<fileset dir="${prop.dir}" excludes="**/*.java"/>
</copy>
</target>
<target name="jar" depends="compile">
<mkdir dir="${jar.dir}"/>
<jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="${classes.dir}">
<manifest>
<attribute name="Main-Class" value="${main-class}"/>
</manifest>
</jar>
</target>
<target name="run" depends="jar">
<java jar="${jar.dir}/${ant.project.name}.jar" fork="true"/>
<classpath>
<path refid="classpath"/>
<path location="${jar.dir}/${ant.project.name}.jar"/>
</classpath>
</target>
<target name="clean-build" depends="clean,jar"/>
<target name="main" depends="clean,run"/>
</project>
蚂蚁运行的新错误
跑:
[java] Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/log4j/Logger
[java] at org.raxa.module.scheduler.TimeSetter.<clinit>(Unknown Source)
[java] at org.raxa.module.loader.LoadServer.main(Unknown Source)
[java] Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Logger
[java] at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
[java] at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
[java] at java.security.AccessController.doPrivileged(Native Method)
[java] at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
[java] at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
[java] at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
[java] at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
[java] ... 2 more
[java] Java Result: 1
BUILD FAILED
/home/atul/Documents/workspace2/Raxa-4/build.xml:41: Problem: failed to create task or type classpath
Cause: The name is undefined.
Action: Check the spelling.
Action: Check that any custom tasks/types have been declared.
Action: Check that any <presetdef>/<macrodef> declarations have taken pla
也许问题是你的类路径被覆盖了。 试试这个:
<java classname="${main-class}" fork="true" >
<classpath>
<path refid="classpath"/>
<pathelement location="${jar.dir}/${ant.project.name}.jar"/>
</classpath>
</classpath> </java>
您不需要定义ANT_HOME
,因为 shell 脚本ant
会为您设置它。 但是,如果您执行了EXPORT ANT_HOME
,您将在启动新终端时看到它。 在您导出环境变量之前,它不会出现在子进程中。
我注意到 Ant 类没有出现在通话中。 如果这是 Ant 问题,您应该已经在堆栈跟踪中的某处看到了对org.apache.tools.ant
的调用。 您可以运行任何其他构建任务吗? 尝试:
$ ant clean
那样有用吗?
Ant 具有广泛的调试跟踪,它向您显示比您想知道的更多的信息。 尝试使用-d
参数运行ant
:
$ ant -d compile | tee ant.out
这将产生大量输出,这就是为什么您需要将其通过管道传输到文件中的原因。 查看ant.out
并查看它失败的地方。 它调用了compile
任务吗?
ant-launcher 调用ant.jar
,然后调用org.ant.tools.taskdefs.javac
(如果我记得路径),然后执行系统命令直接调用javac
可执行文件。 转储将显示的一件事是编译完成时正在执行的确切命令。
这可能会帮助您找到错误发生的位置。 可能是javac
本身没有执行,或者它丢失了。 我以前见过有人不小心将JAVA_HOME
指向 JRE 而不是 JDK。 我也见过可执行文件是 64 位的,但操作系统是 32 位的。
如果转储显示正在执行的实际 Java 命令,请查看是否可以复制它,并将其粘贴到 shell 脚本中并直接执行javac
命令。 这样,我们可以查看问题出在javac
还是 Ant 上。 如果你可以在没有 Ant 的情况下执行javac
,那是 Ant 的问题。 否则,这是您的 Java 安装的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.