【问题标题】:Compiling successful, NoClassDefFoundError at ant java task编译成功,ant java任务出现NoClassDefFoundError
【发布时间】:2014-09-18 14:44:03
【问题描述】:

我已经用谷歌搜索了几个小时,并阅读了很多类似的问题,例如 thisthis 。 现在我将代码简化为几行简短的代码,所以问题应该很明显 - 但我仍然无法解决它。

这是我的两个简单的类:

package ant;
import my.package.util.exception.UtilTest;
public class Debug {
    public static void main(String[] args) {
        System.out.println(UtilTest.myTest());  
 }
}


package my.package.util.exception;
public class UtilTest {
        public static boolean myTest(){
            return true;
        }
}

我构建了 my.package.util.jar 并将其放入项目目录中的目录 lib 中。 现在我运行 ant 构建脚本(见下文)为 Debug 类构建 jar。构建成功,MANIFEST.MF 为:

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.9.4
Created-By: 1.8.0_20-b26 (Oracle Corporation)
Main-Class: ant.Debug
Class-Path: lib/my.package.util.jar

末尾有空行。

这里是 build.xml:

<?xml version="1.0"?>
<project>   

    <path id="my.classpath">
        <fileset dir="lib/" includes="**/*.jar"/>
        <pathelement location="."/>
        <pathelement location="bin"/>
    </path>

    <target name="compile">
        <mkdir dir="build/classes"/>
        <javac includeantruntime="false" srcdir="src" destdir="build/classes" encoding="UTF-8">
            <classpath refid="my.classpath"/>
        </javac>
    </target>

    <target name="jar">
        <mkdir dir="build/jar"/>
        <jar destfile="build/jar/Debug.jar" basedir="build/classes">
            <manifest>
                <attribute name="Main-Class" value="ant.Debug"/>
                <attribute name="Class-Path" value="lib/my.package.util.jar"/>
                <!-- EDIT: to solve the issue, use value="../../lib/my.package.util.jar"/-->
            </manifest>
        </jar>
    </target>

    <target name="debug">
        <java classpath="${my.classpath}" jar="build/jar/Debug.jar" fork="true">
            <arg value="${file}"/>
        </java>
    </target>
</project>

现在运行“ant debug”,我得到:

debug:
        [java] Exception in thread "main" java.lang.NoClassDefFoundError: my/package/util/exception/UtilTest
        [java]  at ant.Debug.main(Unknown Source)
        [java] Caused by: java.lang.ClassNotFoundException: my.package.util.exception.UtilTest
        [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:424)
        [java]  at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
        [java]  at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        [java]  ... 1 more
        [java] Java Result: 1
BUILD SUCCESSFUL
Total time: 1 second

谁能帮忙? :-/

感谢任何提示!

【问题讨论】:

    标签: java ant noclassdeffounderror


    【解决方案1】:

    编辑:你不能那样做,因为如果你使用-jar参数:

    JAR 文件是所有用户类的来源,其他用户类路径设置被忽略(source)

    【讨论】:

    • 谢谢你的回答,但我还是不太明白。 Debug.jar 被执行并导入 my.package.util.jar,它位于 lib/ 中。你的意思是我必须相对于 Debug.jar 来寻址 lib 目录,这意味着从构建目录中?
    • 几天后我也无法理解我的答案;)。
    【解决方案2】:

    问题已解决。

    我终于明白我必须将类路径相对于目标 jar 文件设置,而不是相对于 build.xml。 所以我必须在类路径前面添加../../。

            <manifest>
                <attribute name="Main-Class" value="ant.Debug"/>
                <attribute name="Class-Path" value="../..lib/my.package.util.jar"/>
            </manifest>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-01
      • 2012-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多