首先,通過將批處理文件的第一行更改爲@echo on
,您可以在命令提示符窗口中看到該批處理文件的執行情況,如何在執行過程中逐行解釋和處理該批處理文件。
批處理文件首先將當前工作目錄設置爲批處理文件的目錄,該文件顯然是Java的目錄。
pathmunge
是一個被稱爲像Java中的函數的標籤。 pathmunge
下面的代碼是函數體。在此批文件中的函數pathmunge
具有僅1行代碼:
set CP=%CP%;%1
這是批量代碼等效用於附加的字符串與存儲在變量CP
的環境這顯然短於類路徑另一個字符串。
CP
的初始值只是.
,表示當前目錄。
在pathmunge
的每次調用中,當前工作目錄(批處理文件的目錄)或其子目錄之一的子目錄lib
中具有完整路徑的* .jar文件的名稱將附加在分號後面。
在帶有完整路徑的* .jar文件的名稱中包含1個或多個空格的情況下,文件名將附加在雙引號中。這是不正確的,因爲運行javaw.exe
上的整個類路徑字符串應該用雙引號括起來,而不是每個* .jar文件。
%1
in函數pathmunge
引用第一個函數參數 - 調用pathmunge
時從FOR
循環傳遞的* .jar文件的名稱。
取決於*的數量。jar文件在批處理文件的目錄的子目錄lib
中,環境變量CP
中的字符串可能會變得很長,太長而無法被cmd.exe
處理,請參見Command prompt (Cmd. exe) command-line string limitation。
這是你的問題。有太多的* .jar文件,它們的完整路徑附加到很長的字符串上,最後太長而無法進一步處理。
追加到類路徑目錄列表字符串也是兩個子目錄resources
和conf
使用相對路徑。
使用%1 %2 %3 %4
開始批處理文件時使用的前4個參數的字符串值被引用以傳遞給javaw.exe
作爲參數。如果您只是雙擊批處理文件,那麼這4個變量就是空的。
@echo off
setlocal
cd /D "%~dp0"
set "CP=."
for /R .\lib %%V in (*.jar) do call :pathmunge "%%V"
call :pathmunge .\resources
call :pathmunge .\conf
start "" javaw.exe -Xmx256m -cp "%CP%" com.topcoder.umltool.deploy.UMLToolDeploy %*
endlocal
goto :EOF
:pathmunge
set "CP=%CP%;%~1"
到CP
,附加在雙引號完整路徑每次* .jar文件的名稱,而不是現在完成:(因爲不是由我與Java測試的最有可能的)
更好地將下面的代碼文件名不添加雙引號,而是在運行javaw.exe
時將整個類路徑字符串用雙引號引起來。
並且由於%*
而不是%1 %2 %3 %4
,所以在啓動批處理文件時指定的所有參數現在都會傳遞到javaw.exe
,因爲它們的編號不同。
它可能有助於避免在子目錄lib
及其子目錄中添加相對路徑而不是完整路徑的* .jar文件。這使得類路徑字符串更短。下面的批處理代碼將* .jar文件添加爲相對路徑。
@echo off
setlocal EnableDelayedExpansion
set "UmlToolDirectory=%~dp0"
cd /D "%UmlToolDirectory%"
set "CP=."
for /R .\lib %%V in (*.jar) do (
set "LibraryFile=%%V"
set "LibraryFile=!LibraryFile:%UmlToolDirectory%=.\!"
call :pathmunge "!LibraryFile!"
)
call :pathmunge .\resources
call :pathmunge .\conf
start "" javaw.exe -Xmx256m -cp "%CP%" com.topcoder.umltool.deploy.UMLToolDeploy %*
endlocal
goto :EOF
:pathmunge
set "CP=%CP%;%~1"
如果您想了解更多有關這些命令中的一個,打開命令提示符窗口,通過參數/?
運行命令狀
call /?
cd /?
for /?
goto /?
set /?
setlocal /?
start /?