[問題] java 在 linux 上編譯為 jar 並執行

看板java作者 (追風箏的孩子)時間6年前 (2018/03/18 14:13), 6年前編輯推噓0(0014)
留言14則, 3人參與, 6年前最新討論串1/1
之前都用 IDE 解決,現在突然需要用 jdk 編譯 我有三個目錄: lib (放其他需要引用的 jar), 目前有 json-20180130.jar rank (我的程式 package) class (之後放產生的 class) main function 在 MainRun.java 需要引用其他 jar 的程式引用: import org.json.*; 我編寫的 MANIFEST.MF (放在相同目錄) 和執行 script 有錯誤而執行失敗 這是 MANIFEST.MF 的內容: Manifest-Version: 1.0 Class-Path: . lib/json-20180130.jar Main-Class: MainRun 這是 script 的內容: javac -d class -cp ".:./lib/json-20180130.jar" rank/*.java jar -cvfm rank.jar MANIFEST.MF class/* java -jar rank.jar 請各位大大幫忙看一下哪邊寫錯 ? -- 肝不好 肝若好 人生是黑白的 考卷是空白的 、 ﹐ ● ●b ▎ ●> ● ▌ ﹍﹍ 囧> 幹... ▲ ■┘ ▎ ■ ▋ ︶■ 〈﹀ ∥ ▁▁∥ ▎ ﹀〉▊ 〈\ ψcockroach727 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 47.149.227.123 ※ 文章網址: https://www.ptt.cc/bbs/java/M.1521353594.A.483.html

03/18 16:46, 6年前 , 1F
這種情況多半還是用mvn或者gradle build簡單點吧....
03/18 16:46, 1F

03/19 01:13, 6年前 , 2F
執行script的錯誤訊息是?
03/19 01:13, 2F
added manifest adding: class/rank/(in = 0) (out= 0)(stored 0%) adding: class/rank/MainRun.class(in = 5683) (out= 3133)(deflated 44%) ... Error: Could not find or load main class MainRun ※ 編輯: obelisk0114 (47.149.227.123), 03/19/2018 06:23:41

03/19 09:10, 6年前 , 3F
manifest中的class name要寫rank.MainRun
03/19 09:10, 3F

03/19 09:10, 6年前 , 4F
基本上java所有說到class name的都是指完整名稱
03/19 09:10, 4F
還是有同樣錯誤 目前結構: class (預定放產生的 class) rank (我的程式, main function 在 MainRun, 全部都有加 package rank;) lib (外部 jar, 目前是 json-20180130.jar) script MANIFEST.MF 修改內容: MANIFEST.MF Class-Path: lib/json-20180130.jar Main-Class: class.rank.MainRun script javac -d class -cp lib/json-20180130.jar rank/*.java jar -cvfm rank.jar MANIFEST.MF class/* lib/* ※ 編輯: obelisk0114 (47.149.227.123), 03/19/2018 09:30:10

03/19 09:38, 6年前 , 5F
是rank.MainRun,沒有class.
03/19 09:38, 5F
Error: Could not find or load main class rank.MainRun ※ 編輯: obelisk0114 (47.149.227.123), 03/19/2018 09:46:22

03/19 11:05, 6年前 , 6F
jar -cvfm rank.jar MANIFEST.MF -C class .
03/19 11:05, 6F

03/19 11:06, 6年前 , 7F
jar檔中的相對路徑要跟package一致,要把class重新對應到
03/19 11:06, 7F

03/19 11:07, 6年前 , 8F
jar檔中的根目錄,你可以解開jar檔確認一下
03/19 11:07, 8F
改用大大的指令 jar -cvfm rank.jar MANIFEST.MF -C class . 可以執行成功,但好像不會把 lib 裡面的 jar 包進去 將打包好的 jar 放到別的目錄就無法執行 Exception in thread "main" java.lang.NoClassDefFoundError: org/json/JSONArray at rank.MainRun.main ... Caused by: java.lang.ClassNotFoundException: org.json.JSONArray ... ※ 編輯: obelisk0114 (47.149.227.123), 03/19/2018 13:22:12

03/19 13:41, 6年前 , 9F
jar -cvfm rank.jar MANIFEST.MF -C class . lib/*
03/19 13:41, 9F

03/19 13:42, 6年前 , 10F
我只是把你原本的 class/*換成-C class . (把class目錄下全
03/19 13:42, 10F

03/19 13:42, 6年前 , 11F
包進去且置換成根目錄),其他你原本有的還是要有啊.
03/19 13:42, 11F
放到其他目錄還是有相同錯誤, 不過已經有把那個 jar 包進去了 ※ 編輯: obelisk0114 (47.149.227.123), 03/19/2018 14:27:39

03/19 14:39, 6年前 , 12F
看來單純把jar包進去是不行的,有些執行環境可以是因為用了
03/19 14:39, 12F

03/19 14:40, 6年前 , 13F
特殊的classloader,你必須把lib jar內容解開一起包到你的
03/19 14:40, 13F

03/19 14:41, 6年前 , 14F
jar裡面,或是就一樣把lib jar也複製到你要執行的目錄
03/19 14:41, 14F
文章代碼(AID): #1QhWDwI3 (java)
文章代碼(AID): #1QhWDwI3 (java)