Java:尝试编译Hadoop程序时找不到com.sun.tools.javac.Main

11

当我尝试使用以下命令在Hadoop上编译我的程序时:

bin/hadoop com.sun.tools.javac.Main WordCounter.java

从Hadoop文件夹中,它说:
Error: Could not find or load main class com.sun.tools.javac.Main

我查看了类似的帖子,人们建议检查JAVA_HOME是否正确设置。因此,在etc/hadoop/hadoop-env.sh中添加了这行代码。

export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64

接着检查了一下tools.pack是否已经正确解压到了/usr/lib/jvm/java-7-openjdk-amd64/lib目录下,结果是已经解压好了。然后我尝试执行javac -version命令,结果如下:

javac 1.7.0_65

我尝试重新安装Java,但这并没有解决问题。


为什么tools.jar会被解压而不是简单地添加到类路径中?你的类路径是什么? - David Conrad
工具包,抱歉造成困惑。 - Kudayar Pirimbaev
echo $CLASSPATH 没有输出,我尝试了 export CLASSPATH=/usr/local/java/tools.jar 但是它没有解决问题。 - Kudayar Pirimbaev
tools.pack是什么? - Aaron Digulla
无法找到或加载主类com.sun.tools.javac.main.Hadoop MapReduce。 - Vadzim
3个回答

17

尝试设置HADOOP_CLASSPATH环境变量

export HADOOP_CLASSPATH=$JAVA_HOME/lib/tools.jar

1
这对我有用。在hadoop的设置中,它没有很好的文档记录。 - Zambonilli

0
错误意味着您没有使用JDK启动Hadoop。 JRE(纯运行时)和JDK之间的主要区别是Java编译器javac。 要查看是否有Java编译器,您需要检查两个位置:在$JAVA_HOME/bin文件夹中应该有一个javac,还必须有一个文件$JAVA_HOME/lib/tools.jar
在您的情况下,第一个(启动编译器的二进制文件)可能会丢失,但您绝对需要tools.jar
您说您有一个tools.pack,但我以前没有听说过这个。 使用软件包管理器搜索openjdk,然后在结果列表中查找一个包,其中写着jdk。 在我的系统上,那将是openjdk-7-jdk。 安装此软件包,错误应该消失。

1
tools.jar 存在,并且 javac 也存在。 - Kudayar Pirimbaev
当我进行搜索时,发现已经安装了openjdk-7-jdk。 - Kudayar Pirimbaev
在这种情况下,您的设置被忽略了。如果 bin/hadoop 是一个脚本,则尝试 bash -x bin/hadoop ... 以查看执行了哪些命令以及设置了哪些变量。要将输出重定向到文件,请使用 |& tee hadoop.log。然后,您可以在 hadoop.log 中搜索 hadoop-env.shJAVA_HOME - Aaron Digulla

0

我不得不将Hadoop降级到2.9.2版本,现在它可以正常工作。

我的环境中也有这些内容:

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export PATH=${JAVA_HOME}/bin:${PATH}
export HADOOP_CLASSPATH=${JAVA_HOME}/lib/tools.jar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接