🧩Java JAR 執行後找不到輸出檔?一篇搞懂:從 -jar 正確用法到 properties 與工作目錄完整實戰

 

摘要(SEO)

很多人用 java -jar 跑完轉檔工具後,主控台明明印出「convert … to … .txt」,卻在磁碟裡找不到任何 .txt。本文用軟體工程師的角度、用最白話的方式,帶你一步步確認 JAR 的正確執行方式輸出檔可能落點(目前工作目錄、來源同層或 properties 指定資料夾)、以及如何檢視/更新 JAR 內的 *.properties 設定檔。所有範例皆為匿名、通用化的路徑與檔名,可直接套用在你的環境。


你遇到的典型狀況

  • 指令跑了、主控台有輸出,但找不到 .txt

  • 曾把輸出路徑寫在 *.properties,但實際上不生效

  • 不確定程式到底讀的是外部 properties 檔還是打包在 JAR 裡的那一份。

關鍵觀念先記住:
  1. -jar 必須有減號。
  2. 很多工具會把檔案寫到目前工作目錄 (CWD)來源檔同資料夾
  3. 你改的 properties要確保就是程式真正讀到的那一份


一、正確執行 JAR(先把開場白錯誤拿掉)

1) -jar 不能少減號

# 正確(PowerShell) java -jar .\converter.jar
:: 正確(cmd) java -jar converter.jar

下成 java .jar converter.jar 會讓 Java 以為「.jar 是類別名稱」,導致「找不到或無法載入主要類別 .jar」。


2) 驗證 Java 是否可用

java -version

看到版本號代表 OK。


二、輸出到底會寫在哪?三個最常見落點

  1. 目前工作目錄 (CWD):你下指令的那個資料夾。

  2. 來源檔同資料夾:很多轉檔器會把 .txt 丟在被轉檔的檔案旁邊。

  3. *.properties 指定資料夾:前提是程式真的有讀到那份設定。

快速搜尋(PowerShell)

# 找目前資料夾是否有新 .txt Get-ChildItem -Filter *.txt | Sort-Object LastWriteTime -Desc | Select-Object -First 20 Name,LastWriteTime # 從來源根目錄往下找(請換成你的來源資料夾) Get-ChildItem 'D:\data\input' -Recurse -Include *.txt -ErrorAction SilentlyContinue | Sort-Object LastWriteTime -Desc | Select-Object -First 30 FullName,LastWriteTime

小技巧:切到你想要的輸出夾再執行 JAR,可強迫多數工具把檔案寫在這裡:


pushd D:\data\output java -jar C:\apps\converter\converter.jar popd

三、*.properties 有生效嗎?(外部 vs 內嵌)

許多應用會優先讀取「與 JAR 同層」或「目前工作目錄」的 config.properties;也有不少應用是把 properties 打包在 JAR 裡(例如 BOOT-INF/classes/…)。

做法 A:放一份外部 properties 與 JAR 同層

  1. 把你的設定檔命名與程式碼預期相同(例如 app.properties)。

  2. 放在 converter.jar 同一資料夾。

  3. 重新執行,觀察是否生效。

做法 B:看 JAR 裡面到底有沒有設定檔(推薦)

需要 JDK 的 jar 指令或 7-Zip。以下皆為匿名範例


列出 JAR 內容並搜尋

jar tf "C:\apps\converter\converter.jar" | findstr /i "app.properties"

可能出現:

  • app.properties

  • conf/app.properties

  • BOOT-INF/classes/app.properties

只抽出那一個檔(不必解整包)

cd /d D:\tmp\jarview jar xf "C:\apps\converter\converter.jar" BOOT-INF/classes/app.properties type BOOT-INF\classes\app.properties

沒有 JDK ?用 7-Zip:

"C:\Program Files\7-Zip\7z.exe" l "C:\apps\converter\converter.jar" | findstr /i "app.properties" "C:\Program Files\7-Zip\7z.exe" x "C:\apps\converter\converter.jar" BOOT-INF/classes/app.properties -so | more

四、更新 JAR 內的 properties

找到之後,直接覆蓋回 JAR路徑要一模一樣):


:: 例:在 JAR 根目錄 jar uf "C:\apps\converter\converter.jar" app.properties :: 例:在 BOOT-INF/classes/ jar uf "C:\apps\converter\converter.jar" -C "D:\tmp\jarview\BOOT-INF\classes" app.properties

五、示範一份安全可用的 properties(匿名範例)

# 請改成你的來源資料夾 inputFolderPath = D:\\data\\input # 建議用絕對路徑,並確保資料夾存在 txtOutputPath = D:\\data\\output\\txt xmlOutputPath = D:\\data\\output\\xml # 產生成功清單(可選) successLog = D:\\data\\logs\\success\\filelist.txt failLog = D:\\data\\logs\\fail\\filelist.txt # 允許的檔名樣式(正規表示式,僅為示意) filePattern = .*(?:_CP|_WS).*\\.(?:stdf|std)(?:\\.gz)?$
Windows 的 properties 可用雙反斜線 \\,或斜線 / 皆可:

D:/data/output/txt 也能讀。



六、固定輸出位置的兩種穩招

1) 直接把工作目錄切到輸出夾(最穩)

@echo off set OUT=D:\data\output\txt if not exist "%OUT%" mkdir "%OUT%" pushd "%OUT%" java -Dfile.encoding=UTF-8 -jar "C:\apps\converter\converter.jar" popd echo Done. Check: %OUT%

2) 用 Java 參數傳入(若應用支援)

有些工具支援 -D 系統屬性或 CLI 參數:

java -Doutput.dir="D:\data\output\txt" -jar C:\apps\converter\converter.jar --output "D:\data\output\txt"

七、常見錯誤對照表

現象 可能原因 快修建議
錯誤: 找不到或無法載入主要類別 .jar 少了減號,寫成 java .jar 改成 java -jar app.jar
跑完找不到 .txt 檔案寫到 CWD / 來源同層 / 你看的路徑不對 依序檢查 CWD、來源資料夾、properties 指定夾
properties 改了沒反應 程式讀的是 JAR 內嵌那份 jar tf/xf 找到並覆蓋回 JAR
no main manifest attribute JAR 沒設定 Main-Class java -cp app.jar 完整.主類別 執行或重建可執行 JAR
filelist.txt 為空 邏輯只在「判定成功」時才寫入 先確認輸出真的落地,再回頭看成功條件

八、最後檢查清單(Checklist)

  • java -jar 正確執行。

  • 確認 目前工作目錄來源資料夾設定檔指定的輸出夾三處都查過。

  • jar tf 找到 properties真實內部路徑

  • 若需要,jar uf 將修改後的 properties 覆蓋回 JAR。

  • 用批次檔 鎖定工作目錄 到你想要的輸出夾。

  • 檔名/路徑含空白或非英數時,加引號;Windows 路徑可用 \\/

  • 如需 UTF-8 日誌/文字,加入 -Dfile.encoding=UTF-8


結語

JAR 執行後找不到輸出檔,80% 是路徑與工作目錄造成;另外 20% 則是讀錯 properties(外部 vs 內嵌)。用本文的指令與檢查順序,你可以在幾分鐘內確定輸出落點、驗證設定是否生效,並穩定把輸出固定到你指定的資料夾。如果你的工具支援 CLI 參數或 -D 系統屬性,更能把設定流程標準化與自動化。

留言

這個網誌中的熱門文章

🔍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 錯誤與資料欄位動態插入顯示問題