🔧新手也看得懂:解決 java -jar 與「系統找不到指定的路徑」的完整指南(含 PowerShell 範例)

 

摘要(TL;DR)

  • 指令一定要有 -jarjava -jar your-app.jar(而不是 java .jar)。

  • 「系統找不到指定的路徑」 通常是要寫入的資料夾不存在。先建立父資料夾再寫檔就好了。

  • 相對路徑會跟著工作目錄變:在 PowerShell 你所在的資料夾(pwd)就是程式的相對路徑基準。

  • 保守作法

    1. 絕對路徑執行 JAR。

    2. 寫檔前先 mkdirs()(Java)或預先用 PowerShell 建資料夾。


情境說明(白話版)

你在 Windows 的 PowerShell 裡想執行一個 Java 應用程式(JAR 檔)。
結果遇到兩個超常見的錯誤:

  1. 打成 java .jar xxx.jar → 系統看不懂這個語法。

  2. 程式執行後丟 IOException: 系統找不到指定的路徑。 → 因為你的程式要寫的檔案位置還沒有對應的資料夾

別緊張,這兩件事都很好解。


一、正確的啟動方式:java -jar

常見錯誤

# ❌ 少了減號(-) java .jar my-tool.jar # → 錯誤: 找不到或無法載入主要類別 .jar

正確作法

# ✔ 在 JAR 所在資料夾執行 PS C:\apps\mytool> java -jar .\my-tool.jar # ✔ 任何位置用「絕對路徑」 PS C:\> java -jar "C:\apps\mytool\my-tool.jar"

小提醒:路徑含空白請用引號包住,或在目前資料夾前面加上 .\


二、為什麼會出現「系統找不到指定的路徑」

當 Java 程式要建立檔案(例如寫 log、輸出報表),如果父資料夾不存在,就會丟出 java.io.IOException: 系統找不到指定的路徑。
重點是:建檔 != 建資料夾createNewFile() 只會建檔,不會幫你把資料夾一層層做出來。

你需要做的事

  1. 找到程式要寫入的完整路徑(例如 C:\Data\Reports\run.log)。

  2. 確認上層資料夾(例:C:\Data\Reports\存在

  3. 不存在就先建立,再寫檔。


三、給初學者的一段「更穩」的 Java 範例(與一般教學不同、全新變更的示範)

這段程式碼示範:自動建立父資料夾寫入 UTF-8 文字,並且用使用者家目錄當作安全的輸出位置(避免權限問題)。


import
java.io.File; import java.io.FileOutputStream; import java.nio.charset.StandardCharsets; public class SafeWriterDemo { public static void main(String[] args) { // 1) 以使用者家目錄為基準,減少權限風險 String home = System.getProperty("user.home"); // 例如 C:\Users\你的帳號 File outFile = new File(home + File.separator + "MyApp" + File.separator + "logs" + File.separator + "run.log"); // 2) 若父資料夾不存在就建立 File parent = outFile.getParentFile(); if (parent != null && !parent.exists()) { boolean ok = parent.mkdirs(); // 一次建立多層資料夾 if (!ok) { System.err.println("無法建立資料夾: " + parent.getAbsolutePath()); return; } } // 3) 寫入檔案(若檔案不存在會自動建立) try (FileOutputStream fos = new FileOutputStream(outFile, true)) { String content = "App started successfully.\r\n"; fos.write(content.getBytes(StandardCharsets.UTF_8)); System.out.println("寫入完成 → " + outFile.getAbsolutePath()); } catch (Exception ex) { ex.printStackTrace(); } // 4) 顯示目前工作的相對路徑基準(方便除錯) System.out.println("工作目錄(user.dir) = " + System.getProperty("user.dir")); } }

說人話的重點

  • parent.mkdirs()先建資料夾,這是解法的靈魂。

  • FileOutputStream(..., true):用「附加」方式寫入,不會覆蓋舊資料。

  • user.home:通常擁有可寫入的權限,比把檔案丟到 C:\ 根目錄安全很多。


四、想把輸出放在「JAR 同一層」?(另一種做法)

有時你希望輸出跟 JAR 放一起(例如 my-tool.jar 隔壁的 output\report.txt)。可以先取得 JAR 檔本身所在位置,再去拼接輸出路徑。

import java.io.File; import java.net.URLDecoder; import java.nio.charset.StandardCharsets; public class JarDirOutput { public static void main(String[] args) throws Exception { // 取得 JAR 的實體檔案路徑 String jarPath = JarDirOutput.class .getProtectionDomain() .getCodeSource() .getLocation() .getPath(); // 處理 URL 編碼(空白、中文) String decoded = URLDecoder.decode(jarPath, StandardCharsets.UTF_8); File jarFileOrDir = new File(decoded); File jarDir = jarFileOrDir.isFile() ? jarFileOrDir.getParentFile() : jarFileOrDir; File output = new File(jarDir, "output" + File.separator + "report.txt"); if (!output.getParentFile().exists()) { output.getParentFile().mkdirs(); } System.out.println("輸出將寫到:" + output.getAbsolutePath()); // 之後照前一段用 FileOutputStream / Files.write 去寫檔即可 } }

五、PowerShell 側的「保險手段」

1) 先把資料夾建立好,再執行 JAR

# 例:我要把輸出放在 C:\Data\MyApp\logs\ New-Item -ItemType Directory -Force "C:\Data\MyApp\logs" | Out-Null # 再執行 JAR java -jar "C:\apps\mytool\my-tool.jar"

2) 小小啟動腳本(.bat)— 一次搞定

@echo off setlocal set JAR="%~dp0my-tool.jar" set OUTDIR=C:\Data\MyApp\logs if not exist %OUTDIR% mkdir %OUTDIR% java -jar %JAR% echo ExitCode=%ERRORLEVEL% endlocal

"%~dp0" 代表「這個 bat 檔所在的資料夾」,不怕你從哪個資料夾啟動。



六、排錯清單(Checklist)

  • 指令是否是 java -jar(中間有減號)?

  • JAR 路徑是否正確、有加引號(有空白時)?

  • 程式欲寫入的父資料夾是否存在?若無,記得 mkdirs()

  • 是否不小心想把檔案寫進 JAR 裡或 resources 裡?(那是唯讀的)

  • 相對路徑的基準(user.dir)是你以為的那個資料夾嗎?

  • user.home 或 JAR 同層做輸出,通常權限最單純。


七、常見問答(FAQ)

Q1:我輸入 java .jar 為什麼不行?
A:少了「-」。Java 參數必須寫成 -jarjava .jar 會被當成要執行名為 .jar 的主類別。

Q2:我明明呼叫 createNewFile(),為什麼還是說找不到路徑?
A:因為它只會建檔,不會建資料夾。請先 mkdirs() 父資料夾。

Q3:用相對路徑好還是絕對路徑好?
A:新手建議用絕對路徑。若要相對路徑,請先 System.getProperty("user.dir") 看清楚基準在哪。

Q4:我可以把輸出檔寫在程式 JAR 裡面嗎?
A:不行。JAR 是封裝好的壓縮檔,當作資源供讀取,不能在裡面寫東西。把檔案放 JAR 同層的某個資料夾就好。


結語

  • java -jar 是固定語法,不要少了減號。

  • 「系統找不到指定的路徑」九成以上都是資料夾不存在,請先 mkdirs()

  • 只要遵守「先建資料夾 → 再寫檔」的順序,這類錯誤通常一次解決。

留言

這個網誌中的熱門文章

🔍Vue.js 專案錯誤排查:解決 numericFields is not defined 與合併儲存格邏輯最佳化

🔎EF Core 連 Oracle 出現 ORA-00600 [kpp_concatq:2] 的完整排錯指南(含 EF Core ToString/CultureInfo 錯誤)

🛠【ASP.NET Core + Oracle】解決 ORA-00904 "FALSE": 無效的 ID 錯誤與資料欄位動態插入顯示問題