Skip to content

Commit 4442e67

Browse files
committed
Fix Windows batch file handling of pipe symbols in JVM config
The previous approach of escaping pipe symbols with ^ was insufficient because Windows batch files interpret pipe symbols as command separators even when escaped, causing commands like '*.de' to be executed. This change implements a safer approach: 1. JvmConfigParser.java now outputs each JVM argument on a separate line instead of trying to escape pipe symbols on a single line 2. mvn.cmd creates a temporary batch file that includes the JVM config arguments line by line, avoiding command line parsing issues with pipe symbols 3. The temporary batch file is executed with the Maven arguments, ensuring pipe symbols in JVM config are passed correctly to the Java process This approach completely avoids Windows command line parsing issues with pipe symbols while maintaining compatibility with Linux systems.
1 parent 7019b62 commit 4442e67

File tree

2 files changed

+63
-23
lines changed

2 files changed

+63
-23
lines changed

apache-maven/src/assembly/maven/bin/JvmConfigParser.java

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -74,14 +74,12 @@ public static void main(String[] args) {
7474
// Parse line into individual arguments (split on spaces, respecting quotes)
7575
List<String> parsed = parseArguments(line);
7676

77-
// Append each argument quoted and escape pipe symbols for Windows batch
77+
// Output each argument on a separate line to avoid Windows batch parsing issues
7878
for (String arg : parsed) {
7979
if (result.length() > 0) {
80-
result.append(' ');
80+
result.append('\n');
8181
}
82-
// Escape pipe symbols for Windows batch file processing
83-
String escapedArg = arg.replace("|", "^|");
84-
result.append('"').append(escapedArg).append('"');
82+
result.append(arg);
8583
}
8684
});
8785

apache-maven/src/assembly/maven/bin/mvn.cmd

Lines changed: 60 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -183,9 +183,15 @@ rem Use Java to parse jvm.config to avoid batch script parsing issues with speci
183183
rem This handles pipes, quotes, and other special characters correctly
184184
set "JVM_CONFIG_TEMP=%TEMP%\mvn-jvm-config-%RANDOM%.txt"
185185
"%JAVACMD%" "%MAVEN_HOME%\bin\JvmConfigParser.java" "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" "%MAVEN_PROJECTBASEDIR%" > "%JVM_CONFIG_TEMP%" 2>nul
186-
rem Read the single line from temp file
187-
set /p JVM_CONFIG_MAVEN_OPTS=<"%JVM_CONFIG_TEMP%"
188-
del "%JVM_CONFIG_TEMP%" 2>nul
186+
187+
rem Check if the temp file has content
188+
for %%A in ("%JVM_CONFIG_TEMP%") do set JVM_CONFIG_SIZE=%%~zA
189+
if not "%JVM_CONFIG_SIZE%"=="0" (
190+
set "HAS_JVM_CONFIG=true"
191+
) else (
192+
set "HAS_JVM_CONFIG=false"
193+
del "%JVM_CONFIG_TEMP%" 2>nul
194+
)
189195

190196
:endReadJvmConfig
191197

@@ -228,21 +234,57 @@ for %%i in ("%MAVEN_HOME%"\boot\plexus-classworlds-*) do set LAUNCHER_JAR="%%i"
228234
set LAUNCHER_CLASS=org.codehaus.plexus.classworlds.launcher.Launcher
229235
if "%MAVEN_MAIN_CLASS%"=="" @set MAVEN_MAIN_CLASS=org.apache.maven.cling.MavenCling
230236

231-
"%JAVACMD%" ^
232-
%INTERNAL_MAVEN_OPTS% ^
233-
%MAVEN_OPTS% ^
234-
%JVM_CONFIG_MAVEN_OPTS% ^
235-
%MAVEN_DEBUG_OPTS% ^
236-
--enable-native-access=ALL-UNNAMED ^
237-
-classpath %LAUNCHER_JAR% ^
238-
"-Dclassworlds.conf=%CLASSWORLDS_CONF%" ^
239-
"-Dmaven.home=%MAVEN_HOME%" ^
240-
"-Dmaven.mainClass=%MAVEN_MAIN_CLASS%" ^
241-
"-Dlibrary.jline.path=%MAVEN_HOME%\lib\jline-native" ^
242-
"-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^
243-
%LAUNCHER_CLASS% ^
244-
%MAVEN_ARGS% ^
245-
%*
237+
if "%HAS_JVM_CONFIG%"=="true" (
238+
rem Create a temporary batch file to execute Java with JVM config arguments
239+
setlocal EnableDelayedExpansion
240+
set "JVM_EXEC_TEMP=%TEMP%\mvn-jvm-exec-%RANDOM%.cmd"
241+
echo @echo off > "!JVM_EXEC_TEMP!"
242+
echo "%JAVACMD%" ^ >> "!JVM_EXEC_TEMP!"
243+
if not "%INTERNAL_MAVEN_OPTS%"=="" echo %INTERNAL_MAVEN_OPTS% ^ >> "!JVM_EXEC_TEMP!"
244+
if not "%MAVEN_OPTS%"=="" echo %MAVEN_OPTS% ^ >> "!JVM_EXEC_TEMP!"
245+
rem Add JVM config arguments line by line
246+
for /f "usebackq delims=" %%i in ("%JVM_CONFIG_TEMP%") do (
247+
echo "%%i" ^ >> "!JVM_EXEC_TEMP!"
248+
)
249+
if not "%MAVEN_DEBUG_OPTS%"=="" echo %MAVEN_DEBUG_OPTS% ^ >> "!JVM_EXEC_TEMP!"
250+
echo --enable-native-access=ALL-UNNAMED ^ >> "!JVM_EXEC_TEMP!"
251+
echo -classpath %LAUNCHER_JAR% ^ >> "!JVM_EXEC_TEMP!"
252+
echo "-Dclassworlds.conf=%CLASSWORLDS_CONF%" ^ >> "!JVM_EXEC_TEMP!"
253+
echo "-Dmaven.home=%MAVEN_HOME%" ^ >> "!JVM_EXEC_TEMP!"
254+
echo "-Dmaven.mainClass=%MAVEN_MAIN_CLASS%" ^ >> "!JVM_EXEC_TEMP!"
255+
echo "-Dlibrary.jline.path=%MAVEN_HOME%\lib\jline-native" ^ >> "!JVM_EXEC_TEMP!"
256+
echo "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ >> "!JVM_EXEC_TEMP!"
257+
echo %LAUNCHER_CLASS% ^ >> "!JVM_EXEC_TEMP!"
258+
if not "%MAVEN_ARGS%"=="" echo %MAVEN_ARGS% ^ >> "!JVM_EXEC_TEMP!"
259+
echo %%* >> "!JVM_EXEC_TEMP!"
260+
261+
rem Execute the temporary batch file
262+
call "!JVM_EXEC_TEMP!" %*
263+
set JAVA_EXIT_CODE=!ERRORLEVEL!
264+
265+
rem Clean up temporary files
266+
del "%JVM_CONFIG_TEMP%" 2>nul
267+
del "!JVM_EXEC_TEMP!" 2>nul
268+
269+
endlocal & set ERROR_CODE=%JAVA_EXIT_CODE%
270+
if %ERROR_CODE% NEQ 0 goto error
271+
) else (
272+
"%JAVACMD%" ^
273+
%INTERNAL_MAVEN_OPTS% ^
274+
%MAVEN_OPTS% ^
275+
%MAVEN_DEBUG_OPTS% ^
276+
--enable-native-access=ALL-UNNAMED ^
277+
-classpath %LAUNCHER_JAR% ^
278+
"-Dclassworlds.conf=%CLASSWORLDS_CONF%" ^
279+
"-Dmaven.home=%MAVEN_HOME%" ^
280+
"-Dmaven.mainClass=%MAVEN_MAIN_CLASS%" ^
281+
"-Dlibrary.jline.path=%MAVEN_HOME%\lib\jline-native" ^
282+
"-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^
283+
%LAUNCHER_CLASS% ^
284+
%MAVEN_ARGS% ^
285+
%*
286+
if ERRORLEVEL 1 goto error
287+
)
246288
if ERRORLEVEL 1 goto error
247289
goto end
248290

0 commit comments

Comments
 (0)