🔧新手也看得懂:解決 java -jar 與「系統找不到指定的路徑」的完整指南(含 PowerShell 範例)
摘要(TL;DR)
-
指令一定要有
-jar:java -jar your-app.jar(而不是java .jar)。 -
「系統找不到指定的路徑」 通常是要寫入的資料夾不存在。先建立父資料夾再寫檔就好了。
-
相對路徑會跟著工作目錄變:在 PowerShell 你所在的資料夾(
pwd)就是程式的相對路徑基準。 -
保守作法:
-
用絕對路徑執行 JAR。
-
寫檔前先
mkdirs()(Java)或預先用 PowerShell 建資料夾。
-
情境說明(白話版)
你在 Windows 的 PowerShell 裡想執行一個 Java 應用程式(JAR 檔)。
結果遇到兩個超常見的錯誤:
-
打成
java .jar xxx.jar→ 系統看不懂這個語法。 -
程式執行後丟
IOException: 系統找不到指定的路徑。→ 因為你的程式要寫的檔案位置還沒有對應的資料夾。
別緊張,這兩件事都很好解。
一、正確的啟動方式:java -jar
常見錯誤
正確作法
二、為什麼會出現「系統找不到指定的路徑」
當 Java 程式要建立檔案(例如寫 log、輸出報表),如果父資料夾不存在,就會丟出 java.io.IOException: 系統找不到指定的路徑。
重點是:建檔 != 建資料夾。createNewFile() 只會建檔,不會幫你把資料夾一層層做出來。
你需要做的事
-
找到程式要寫入的完整路徑(例如
C:\Data\Reports\run.log)。 -
確認上層資料夾(例:
C:\Data\Reports\)存在。 -
不存在就先建立,再寫檔。
三、給初學者的一段「更穩」的 Java 範例(與一般教學不同、全新變更的示範)
這段程式碼示範:自動建立父資料夾、寫入 UTF-8 文字,並且用使用者家目錄當作安全的輸出位置(避免權限問題)。
說人話的重點
-
parent.mkdirs():先建資料夾,這是解法的靈魂。 -
FileOutputStream(..., true):用「附加」方式寫入,不會覆蓋舊資料。 -
user.home:通常擁有可寫入的權限,比把檔案丟到C:\根目錄安全很多。
四、想把輸出放在「JAR 同一層」?(另一種做法)
有時你希望輸出跟 JAR 放一起(例如 my-tool.jar 隔壁的 output\report.txt)。可以先取得 JAR 檔本身所在位置,再去拼接輸出路徑。
五、PowerShell 側的「保險手段」
1) 先把資料夾建立好,再執行 JAR
2) 小小啟動腳本(.bat)— 一次搞定
"%~dp0" 代表「這個 bat 檔所在的資料夾」,不怕你從哪個資料夾啟動。
六、排錯清單(Checklist)
-
指令是否是
java -jar(中間有減號)? -
JAR 路徑是否正確、有加引號(有空白時)?
-
程式欲寫入的父資料夾是否存在?若無,記得
mkdirs()。 -
是否不小心想把檔案寫進 JAR 裡或
resources裡?(那是唯讀的) -
相對路徑的基準(
user.dir)是你以為的那個資料夾嗎? -
用
user.home或 JAR 同層做輸出,通常權限最單純。
七、常見問答(FAQ)
Q1:我輸入 java .jar 為什麼不行?
A:少了「-」。Java 參數必須寫成 -jar,java .jar 會被當成要執行名為 .jar 的主類別。
Q2:我明明呼叫 createNewFile(),為什麼還是說找不到路徑?
A:因為它只會建檔,不會建資料夾。請先 mkdirs() 父資料夾。
Q3:用相對路徑好還是絕對路徑好?
A:新手建議用絕對路徑。若要相對路徑,請先 System.getProperty("user.dir") 看清楚基準在哪。
Q4:我可以把輸出檔寫在程式 JAR 裡面嗎?
A:不行。JAR 是封裝好的壓縮檔,當作資源供讀取,不能在裡面寫東西。把檔案放 JAR 同層的某個資料夾就好。
結語
-
java -jar是固定語法,不要少了減號。 -
「系統找不到指定的路徑」九成以上都是資料夾不存在,請先
mkdirs()。 -
只要遵守「先建資料夾 → 再寫檔」的順序,這類錯誤通常一次解決。
留言
張貼留言