[问题] 自行编译打包却 ClassNotFound(已解决)

楼主: art1 (人,原来不是人)   2020-03-29 01:00:09
原始码是从这个网址下载的 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()); 没起到效果
但不知道该从何改起,我试过把这行注解掉,还是出现同样的错误讯息
想请问自行编译原始码却出现这种找不到类别的错误该怎么排除呢?
楼主: art1 (人,原来不是人)   2020-03-29 03:39:00
原来是路径的关系,我的 jar 是放在/classes 底下,他的没有我的 KMeansMapper.class 没在根目录,而在 /classes 底下导致了这个错误改成 hadoop com.sun.tools.javac.Main @source.txt -d ./跟 jar cf km.jar ./ 就解决了不过这样会把很多多余的东西包进去,还要再想想办法hadoop com.sun.tools.javac.Main @source.txt -d ./classesjar cf km.jar -C ./classes .改成这样就没问题了
作者: hpa82228   2020-03-31 23:42:00
认真推
作者: weakstudy (台湾高阶管理人)   2020-04-16 21:40:00
谢谢分享 ~~~ 大推认真的态度!

Links booklink

Contact Us: admin [ a t ] ucptt.com