【问题标题】:Apache Ant java.lang.NoClassDefFoundErrorApache Ant java.lang.NoClassDefFoundError
【发布时间】:2013-07-25 23:52:13
【问题描述】:

可能的答案Stack Over flow question

我的问题与上述线程中描述的相同。我通过了解决方案但它不起作用。 ant compile 完美运行。 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 会给出 null。

here is a screen shot

初始错误

     <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>

新错误在 ant run 上

运行:

[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

ce.

【问题讨论】:

  • 让我们看看你的build.xml
  • 查看edit.Edited build.xml
  • 您的jar 目标类路径还应包括classes.dir 文件夹。
  • 基于此:但 echo$ANT_HOME 给出了 null 我认为您的 ANT 配置不正确。如果你去 '/usr/share/ant/bin' 并执行 './ant' 你会得到什么吗?如果是,您可以尝试删除 ANT_HOME="/usr/share/ant/" 末尾的最后一个斜杠
  • 是的,谢谢..我已经对其进行了编辑并且可以正常工作。但是它无法加载外部库。新编辑有问题吗?

标签: java ant


【解决方案1】:

也许问题是你的类路径被覆盖了。试试这个:

<java classname="${main-class}" fork="true" >
  <classpath>
    <path refid="classpath"/>
    <pathelement location="${jar.dir}/${ant.project.name}.jar"/>
  </classpath>
</classpath> </java>

【讨论】:

    【解决方案2】:

    您不需要定义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 安装的问题。

    【讨论】:

      猜你喜欢
      • 2018-12-16
      • 2015-03-14
      • 2011-05-12
      • 1970-01-01
      • 2019-06-23
      • 1970-01-01
      • 1970-01-01
      • 2016-11-26
      • 2014-09-15
      相关资源
      最近更新 更多