带有Ant的Java NoClassDefFoundError

时间:2014-07-11 14:23:29

标签: java ant classpath

我在.jar文件夹中有第三方res/lib文件。 ANT build.xml看起来像这样:

<?xml version="1.0"?>
<project name="my.project" basedir="." default="build">
    <property name="src.dir" value="src"/>
    <property name="build.dir" value="build/classes"/>

    <path id="master-classpath">
        <fileset dir="res/lib">
            <include name="*.jar"/>
        </fileset>
        <pathelement path="${build.dir}"/>
    </path>

    <target name="build">
        <mkdir dir="${build.dir}"/>
        <javac destdir="${build.dir}" optimize="true">
            <src path="${src.dir}"/>
            <classpath refid="master-classpath"/>
        </javac>
    </target>
</project>

.java文件如下:

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVPrinter;
import org.apache.commons.csv.CSVRecord;

public class IO {
    public static void readCSVFile(File file) throws IOException {
        FileReader in = new FileReader(file);
        Iterable<CSVRecord> record = CSVFormat.DEFAULT.parse(in);
    }
}

编译没问题,但我收到了运行时错误:java.lang.NoClassDefFoundError: org/apache/commons/csv/CSVFormat。我认为类路径有问题,但对我来说似乎没问题。

更新:

如果我使用java -cp path;. Main,它正在运行。我曾尝试编写一个ANT脚本来运行它:

<target name="run">
    <java classname="Main">
        <classpath refid="master-classpath"/>
    </java>
</target>

我在命令行中写ant run,得到BUILD SUCCESSFUL但没有任何反应。

3 个答案:

答案 0 :(得分:2)

您的构建文件编译您的代码并在类路径中包含第三方Jar,以便编译器能够找到您的代码所依赖的类(例如org.apache.commons.csv.CSVRecord)。

同样,当通过java运行主类时,您的JVM需要知道第三方类的存在位置。否则,类加载器将无法加载这些类。因此,在您的示例中,您仍应按如下方式调用主类:

java -cp pathtoyourlib;. Main

换句话说,这是两个不同的&#34;类路径&#34;概念:编译器使用一个类路径来知道在每个要编译的类中找到每个引用类的位置,而另一个类路径由JVM用来知道在动态调用类时加载类的位置。

答案 1 :(得分:0)

您的班级没有(可见)主要方法

public static void main(String[] args){
    IO.readCSVFile(File file)
}

运行文件时需要传递类路径

java -cp yourclasspath

答案 2 :(得分:0)

你声明编译没问题,但你没有说明你是如何运行java程序的.....所以要清楚,ANT完成没有错误?这是从命令行运行java程序后编译的问题吗?

如果我没错,那么有两个问题:

  1. 您的java程序没有主类(需要从命令行运行)
  2. 运行java程序时,程序所依赖的jar包含在类路径中。