【发布时间】:2013-05-30 06:05:36
【问题描述】:
所以在浏览了很多关于 SO 的帖子并修改了一些 java 基础知识后,我仍然收到这个错误
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/io/Writable
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2451)
at java.lang.Class.getMethod0(Class.java:2694)
at java.lang.Class.getMethod(Class.java:1622)
at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:494)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:486)
我知道 Java 中 java.lang.NoClassDefFoundError 和 ClassNotFoundException 之间的区别,并查看了通常导致它的原因。简而言之,这是因为某些类在运行时对程序不可用,但在编译时可用。因此我没有编译时错误。
我添加了两个类路径,一个到commons-logging-1.1.3.jar,另一个到hadoop-core.*jar。
我非常确信类路径是正确的。
这是我的程序中的导入
import java.io.*;
import org.apache.hadoop.io.SequenceFile;
import org.apache.hadoop.io.SequenceFile.*;
import org.apache.hadoop.io.SequenceFile.Writer;
import org.apache.hadoop.io.*;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.io.Writable;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.conf.*;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.*;
【问题讨论】:
-
这个类在 hadoop-core jar 中,你能准确地写出你是如何运行你的工作的(包括类路径)吗?
-
@CharlesMenguy 我使用的是 ubuntu 12.04,这是编译它的命令行 javac -cp "/home/hduser/hadoop/hadoop-core-1.1.2.jar:/home/hduser/Documents /commons-logging-1.1.3/commons-logging-1.1.3.jar" TSVtoSeq.java 要运行,java TSVtoSeq TrainingT1.tsv testOutput 2 个参数被传递给主文件、输入文件和输出文件
-
您在运行程序时没有使用
java -cp $JARS设置类路径吗? -
@CharlesMenguy 所以,我在运行程序时添加了类路径(但有必要吗?),我仍然抛出相同的异常。但是,现在指向的类是“org/apache/commons/configuration/Configuration”而不是“org/apache/hadoop/io/Writable”
-
@shashlearner 那是因为有很多 jars hadoop 依赖(可以在 HADOOP_HOME/lib 中找到)并且在运行时其中几个被引用。要么继续手动试错,直到你让它运行,要么在你运行它时将所有这些 jars 添加到类路径中。一种标准方法是创建一个 jar 代码并使用 bin/hadoop 脚本运行,如下面我的回答中所述。
标签: java hadoop runtime-error noclassdeffounderror