首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Maven antrun 插件導致「CreateProcess error=206 文件名過長」的根因與精準解決方案

     編輯:Java 綜合教學

錯誤現象

使用 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 即可運行。

精準解決:指定最小 classpath

利用 Maven AntRun 提供的 <path> 元素,僅引入目標 JAR:


    org.apache.maven.plugins
    maven-antrun-plugin
    1.8  
    
        
            generate-sources
            run
            
                
                    
                    
                    
                    
                        
                    
                    
                        
                        
                        
                        
                        
                        
                    
                
            
        
    
    
        
            com.google.javascript
            closure-compiler
            v20231001  
        
    

關鍵技巧:獲取單個依賴 JAR 的絕對路徑

在 <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 依賴、學習成本
縮短路徑(移動專案到淺層目錄)零配置治標不治本、團隊協作不一致

最佳實踐總結

  1. **原則**:fork=true 的 java 任務,**永遠只傳遞必要的 classpath**。
  2. **工具**:優先使用 maven-dependency-plugin:copy 將工具 JAR 固化到 target/tools/,再由 AntRun 引用。
  3. **現代化**:新專案建議遷移至 frontend-maven-plugin + terser/esbuild,完全繞開 Java 命令行限制。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved