作者art1 (人,原来不是人)
看板java
标题[问题] 自行编译打包执行却出现 ClassNotFound
时间Sun Mar 29 01:00:09 2020
原始码是从这个网址下载的
https://github.com/Maki94/kmeans_mapreduce
如果我使用他提供的 executable_jar/kmeans_mapreduce.jar 可以正常执行
但如果我自己下指令把 .java 编译成 .class
find -name "*.java" > source.txt
hadoop com.sun.tools.javac.Main @source.txt -d ./classes
再用 jar 指令把这些 .class 打包成 jar 档案
jar cf km.jar ./classes
然後修改他提供的 run.sh 档
把 JAR_PATH 从 ./executable_jar/kmeans_mapreduce.jar 改成 ./km.jar
之後执行 run.sh 就会跳出下面的主要错误讯息
Error: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class
KMeansMapper not found
Caused by: java.lang.ClassNotFoundException: Class KMeansMapper not found
我检查自行打包的 jar 档的结构跟他提供的 jar 档的结构并没有不同,
KMeansMapper.class 都是放在 jar 根目录底下,只是他的 jar 多了很多其他东西,但
错误讯息跟多的那些东西「看起来」没有直接相关
目前怀疑是 JobIterator.java 中的 setJarByClass(getClass()); 没起到效果
但不知道该从何改起,我试过把这行注解掉,还是出现同样的错误讯息
想请问自行编译原始码却出现这种找不到类别的错误该怎麽排除呢?
--
「看在上帝的份上,我们不能当着孩子的面枪杀他的父亲!」
「那我们就连孩子一起干掉!」
「第一枪打中的是那个天真的孩子,第二枪是抱着孩子的母亲。第三枪
停顿了三秒,当难以致信的父亲擦拭着脸上爱子的脑浆从震惊中醒转
过来,慢慢的转头看向停车的地方,分辨出是谁在攻击他後,第三颗
子弹才将他的脑壳打飞。」 ─摘自〈狼群〉
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 36.236.104.139 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/java/M.1585414813.A.FD6.html
1F:→ art1: 原来是路径的关系,我的 jar 是放在/classes 底下,他的没有 03/29 03:39
2F:→ art1: 我的 KMeansMapper.class 没在根目录,而在 /classes 底下 03/29 03:50
3F:→ art1: 导致了这个错误 03/29 03:50
4F:→ art1: 改成 hadoop com.sun.tools.javac.Main @source.txt -d ./ 03/29 03:52
5F:→ art1: 跟 jar cf km.jar ./ 就解决了 03/29 03:53
6F:→ art1: 不过这样会把很多多余的东西包进去,还要再想想办法 03/29 04:06
7F:→ art1: hadoop com.sun.tools.javac.Main @source.txt -d ./classes 03/29 04:10
8F:→ art1: jar cf km.jar -C ./classes . 03/29 04:10
9F:→ art1: 改成这样就没问题了 03/29 04:11
10F:推 hpa82228: 认真推 03/31 23:42
11F:推 weakstudy: 谢谢分享 ~~~ 大推认真的态度! 04/16 21:40