使用 maven-antrun-plugin 調用 closure-compiler 壓縮 JS 時,構建失敗:
CreateProcess error=206, The filename or extension is too long
Windows 命令行長度限制:XP/2000 為 2047 字符,Vista/7/10/11 為 8191 字符。
執行 mvn package -X 觀察完整命令,發現:
...
關鍵點:classpathref="maven.compile.classpath" 會將**專案所有編譯依賴的 JAR 路徑**拼接成超長 classpath 字串傳給 java 命令,遠超系統限制。實際只需 closure-compiler.jar 一個 JAR 即可運行。
利用 Maven AntRun 提供的 <path> 元素,僅引入目標 JAR:
org.apache.maven.plugins maven-antrun-plugin 1.8 generate-sources run com.google.javascript closure-compiler v20231001
在 <configuration> 外層或 properties 中定義:
${settings.localRepository}/com/google/javascript/closure-compiler/v20231001/closure-compiler-v20231001.jar
或使用 maven-dependency-plugin 的 copy 目標將 JAR 複製到固定目錄再引用。
| 方案 | 優點 | 缺點 |
|---|---|---|
| 指定最小 classpath(本文) | 精準解決、不改構建邏輯、效能最好 | 需手動維護路徑屬性 |
| 升級 Maven 3.6+ / JDK 9+ | 支援 @argfile 長命令文件 | 需升級環境、不解決根本膨脹 |
| 改用 frontend-maven-plugin + Node.js | 現代前端工具鏈、功能豐富 | 引入 Node 依賴、學習成本 |
| 縮短路徑(移動專案到淺層目錄) | 零配置 | 治標不治本、團隊協作不一致 |
fork=true 的 java 任務,**永遠只傳遞必要的 classpath**。maven-dependency-plugin:copy 將工具 JAR 固化到 target/tools/,再由 AntRun 引用。frontend-maven-plugin + terser/esbuild,完全繞開 Java 命令行限制。