[問題] 自行編譯打包執行卻出現 ClassNotFound

看板java作者 (人,原來不是人)時間4年前 (2020/03/29 01:00), 編輯推噓2(209)
留言11則, 3人參與, 4年前最新討論串1/1
原始碼是從這個網址下載的 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://www.ptt.cc/bbs/java/M.1585414813.A.FD6.html

03/29 03:39, 4年前 , 1F
原來是路徑的關係,我的 jar 是放在/classes 底下,他的沒有
03/29 03:39, 1F

03/29 03:50, 4年前 , 2F
我的 KMeansMapper.class 沒在根目錄,而在 /classes 底下
03/29 03:50, 2F

03/29 03:50, 4年前 , 3F
導致了這個錯誤
03/29 03:50, 3F

03/29 03:52, 4年前 , 4F
改成 hadoop com.sun.tools.javac.Main @source.txt -d ./
03/29 03:52, 4F

03/29 03:53, 4年前 , 5F
跟 jar cf km.jar ./ 就解決了
03/29 03:53, 5F

03/29 04:06, 4年前 , 6F
不過這樣會把很多多餘的東西包進去,還要再想想辦法
03/29 04:06, 6F

03/29 04:10, 4年前 , 7F
hadoop com.sun.tools.javac.Main @source.txt -d ./classes
03/29 04:10, 7F

03/29 04:10, 4年前 , 8F
jar cf km.jar -C ./classes .
03/29 04:10, 8F

03/29 04:11, 4年前 , 9F
改成這樣就沒問題了
03/29 04:11, 9F

03/31 23:42, 4年前 , 10F
認真推
03/31 23:42, 10F

04/16 21:40, 4年前 , 11F
謝謝分享 ~~~ 大推認真的態度!
04/16 21:40, 11F
文章代碼(AID): #1UVuAT_M (java)
文章代碼(AID): #1UVuAT_M (java)