带有Ant的Java NoClassDefFoundError
我在res/lib
文件夹中有第三方.jar
文件。 ANT build.xml
如下所示:
.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 record = CSVFormat.DEFAULT.parse(in); } }
编译没问题,但是我遇到了运行时错误: java.lang.NoClassDefFoundError: org/apache/commons/csv/CSVFormat
。 我认为类路径有问题,但对我来说似乎没问题。
更新:
如果我使用java -cp path;. Main
它正在运行java -cp path;. Main
java -cp path;. Main
。 我曾尝试编写一个ANT脚本来运行它:
我在命令行中编写了ant run
,我得到了BUILD SUCCESSFUL
,没有任何反应。
您的构建文件编译您的代码并在类路径中包含第三方Jar,以便编译器能够找到您的代码所依赖的类(例如org.apache.commons.csv.CSVRecord
)。
类似地,当通过java
运行主类时,您的JVM需要知道第三方类的存在位置。 否则,类加载器将无法加载这些类。 因此,在您的示例中,您仍应按如下方式调用主类:
java -cp pathtoyourlib;. Main
换句话说,这是两个不同的“类路径”概念:编译器使用一个类路径来知道在每个要编译的类中找到每个引用类的位置,而另一个类路径由JVM用来知道何时加载类它们是动态调用的。
你声明编译没问题,但是你没有说明你是如何运行java程序的…..所以要清楚,ANT完成没有错误? 这是从命令行运行java程序后编译的问题?
如果我没错,那么有两个问题:
- 你的java程序没有主类(需要从命令行运行)
- 在运行java程序时,程序所依赖的jar包含在类路径中。
你的class级没有(可见)主要方法
public static void main(String[] args){ IO.readCSVFile(File file) }
运行该文件时需要传递类路径
java -cp yourclasspath