[問題] 自行編譯打包卻 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