最近寫了個小工具,在用eclipse導出可運行jar包時,遇到一連串的問題,雙擊沒反應,命令行中jar命令運行報錯“**.jar中沒有主清單屬性”或者報錯“Error: Invalid or corrupt jarfile **.jar”。 接下來依次總結解決問題的方法:
一、可運行jar雙擊沒反應或者一閃而過——解決辦法:
1、修改註冊表
(此項多篇博客和論壇帖子都有介紹,但是我的電腦始終不成功,這裏記錄一個思路):
首先確認環境變量是否配置,JAVA_HOME配置的是什麼?下面的配置javaw.exe的路徑用自己環境變量配置的java路徑;
修改註冊表(cmd——regedit進入):
HKEY_CLASSES_ROOT\Applications\javaw.exe\shell\open\command——默認(左擊)——右鍵(修改)——"D:\java\jre\bin\javaw.exe" -jar "%1" %*
修改註冊表()
HKEY_CLASSES_ROOT\jar_auto_file\shell\open\command——默認(左擊)——右鍵(修改)——"D:\java\jre\bin\javaw.exe" -jar "%1" %*
小提示:
1、jar_auto_file可能名字不一樣,在註冊表中.jar中查看對應的名字就好,我的是jarfile。
2、也有可能不存在\shell\open\command,右鍵新建項就好了。
2、用bat執行:
新建一個text文檔,內容如下:(e2w是我的jar包名字),文檔改爲.bat保存即可;
小提示:下一行加一個pause命令,便於觀察報錯或者命令行輸出;
3、cmd命令行中定位到jar包所在的文件夾並執行命令: java -jar **.jar 即可;
小提示:命令行窗口定位文件夾的快捷方式:在當前文件夾下,注意不選中任何文件和文件夾,按住shift鍵,同時點擊鼠標右鍵,出現菜單欄,選擇“在此處打開powershell窗口”即可。
二、命令行執行報錯:“**.jar中沒有主清單屬性”——解決辦法:
這是由於META-INF/MANIFEST.MF文件中,缺少了Main-Class屬性配置項,這個配置項指定了jar命令運行方式的程序入口類;
三、命令行執行報錯:“Error: Invalid or corrupt jarfile **.jar”——解決辦法:
這是由於雖然META-INF/MANIFEST.MF文件中有Main-Class屬性配置項,但是內容爲空或者缺少空格;
小提示:以下是需要注意的各個要點:
1. Manifest-Version、Main-Class和Class-Path後面跟着一個英文的冒號,冒號後面必須跟着一個空格,然後纔是版本號、類和ClassPath。
2. Class-Path中的各項應使用空格分隔,不是逗號或分號。
3. Class-Path中如果有很多項,寫成一行打包的時候會報錯line too long,這時需要把Class-Path分多行寫。注意:從第二行開始,必須以兩個空格開頭,三個以上我沒試過,不過不用空格開頭和一個空格開頭都是不行的,我已經試過了。
4. Class-Path寫完之後最後一定要有一個空行。
5. jar包內有些配置文件想放在jar包外面,比如文件config.properties:如果這個文件是以路徑方式載入的,比如new file("./config/config.properties"),那麼將config.properties放在jar包相同目錄下的config目錄下即可,也就是說“./”路徑等價於jar包所在目錄;如果這個文件是以ClassPath下的文件這種方式載入的,比如在Spring中載入classpath:config.properties,則在MF文件的配置文件的ClassPath中添加“./”,然後將這個配置文件與jar包放在同一個目錄即可,當然也可以在MF文件的配置文件的ClassPath中添加“./config/”,然後把配置文件都放在jar包相同目錄下的config目錄下。
四、“錯誤:找不到或無法加載主類 **.jar ”——包名、類名寫錯,按照正確的寫法:包名.類名,如: e2w.Main00
小提示:關於MANIFEST.MF文件詳解,請參考MANIFEST.MF文件詳解