You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by gn...@apache.org on 2025/12/04 13:26:20 UTC
(maven) 01/01: Fix Windows jvm.config parsing and add debug logging to scripts
This is an automated email from the ASF dual-hosted git repository.
gnodet pushed a commit to branch fix/mng-11363-pipe-symbols-jvm-config
in repository https://gitbox.apache.org/repos/asf/maven.git
commit 9cca61cc88b3bdbc06105007c3d0d16b71ccde53
Author: Guillaume Nodet <gn...@gmail.com>
AuthorDate: Thu Dec 4 11:27:44 2025 +0100
Fix Windows jvm.config parsing and add debug logging to scripts
- mvn.cmd: Use 'cmd /c' to run JvmConfigParser in a subshell, ensuring
file handles are properly released before reading the temp file.
The previous 'for /f' with backticks approach did not correctly
capture the Java output on Windows.
- mvn, mvn.cmd: Add debug logging controlled by MAVEN_DEBUG_SCRIPT
environment variable. When set, both scripts will output detailed
information about jvm.config parsing, including:
- Path to jvm.config file
- Java command and arguments
- Parser exit code and output
- Final MAVEN_OPTS/JVM_CONFIG_MAVEN_OPTS value
- Full JVM command line before launching Maven
This helps diagnose jvm.config issues on CI systems where the log
files are the primary debugging tool.
---
apache-maven/src/assembly/maven/bin/mvn | 21 +++++++++
apache-maven/src/assembly/maven/bin/mvn.cmd | 67 +++++++++++++++++++++++++----
2 files changed, 79 insertions(+), 9 deletions(-)
diff --git a/apache-maven/src/assembly/maven/bin/mvn b/apache-maven/src/assembly/maven/bin/mvn
index 700aafab63..1a8e6a2fdc 100755
--- a/apache-maven/src/assembly/maven/bin/mvn
+++ b/apache-maven/src/assembly/maven/bin/mvn
@@ -169,11 +169,19 @@ find_file_argument_basedir() {
# Uses Java-based parser to handle all special characters correctly
# This avoids shell parsing issues with pipes, quotes, @, and other special characters
# and ensures POSIX compliance (no xargs -0, awk, or complex sed needed)
+# Set MAVEN_DEBUG_SCRIPT=1 to enable debug logging
concat_lines() {
if [ -f "$1" ]; then
# Use Java source-launch mode (JDK 11+) to run JvmConfigParser directly
# This avoids the need for compilation and temporary directories
+ # Debug logging
+ if [ -n "$MAVEN_DEBUG_SCRIPT" ]; then
+ echo "[DEBUG] Found jvm.config file at: $1" >&2
+ echo "[DEBUG] Running JvmConfigParser with Java: $JAVACMD" >&2
+ echo "[DEBUG] Parser arguments: $MAVEN_HOME/bin/JvmConfigParser.java $1 $MAVEN_PROJECTBASEDIR" >&2
+ fi
+
# Verify Java is available
"$JAVACMD" -version >/dev/null 2>&1 || {
echo "Error: Java not found. Please set JAVA_HOME." >&2
@@ -185,6 +193,11 @@ concat_lines() {
parser_output=$("$JAVACMD" "$MAVEN_HOME/bin/JvmConfigParser.java" "$1" "$MAVEN_PROJECTBASEDIR" 2>&1)
parser_exit=$?
+ if [ -n "$MAVEN_DEBUG_SCRIPT" ]; then
+ echo "[DEBUG] JvmConfigParser exit code: $parser_exit" >&2
+ echo "[DEBUG] JvmConfigParser output: $parser_output" >&2
+ fi
+
if [ $parser_exit -ne 0 ]; then
# Parser failed - print comprehensive error information
echo "ERROR: JvmConfigParser failed with exit code $parser_exit" >&2
@@ -210,6 +223,9 @@ if [ -n "$_jvm_config" ]; then
MAVEN_OPTS="$_jvm_config"
fi
fi
+if [ -n "$MAVEN_DEBUG_SCRIPT" ]; then
+ echo "[DEBUG] Final MAVEN_OPTS: $MAVEN_OPTS" >&2
+fi
LAUNCHER_JAR=`echo "$MAVEN_HOME"/boot/plexus-classworlds-*.jar`
LAUNCHER_CLASS=org.codehaus.plexus.classworlds.launcher.Launcher
@@ -278,4 +294,9 @@ for arg in "$@"; do
cmd="$cmd \"$arg\""
done
+if [ -n "$MAVEN_DEBUG_SCRIPT" ]; then
+ echo "[DEBUG] Launching JVM with command:" >&2
+ echo "[DEBUG] $cmd" >&2
+fi
+
eval exec "$cmd"
diff --git a/apache-maven/src/assembly/maven/bin/mvn.cmd b/apache-maven/src/assembly/maven/bin/mvn.cmd
index dfd048716c..85e81e99cf 100644
--- a/apache-maven/src/assembly/maven/bin/mvn.cmd
+++ b/apache-maven/src/assembly/maven/bin/mvn.cmd
@@ -184,21 +184,51 @@ if not exist "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadJvmConfig
rem Use Java source-launch mode (JDK 11+) to parse jvm.config
rem This avoids batch script parsing issues with special characters (pipes, quotes, @, etc.)
-rem Capture stdout directly using for /f to avoid temp file locking issues on Windows
+rem Use temp file approach with cmd /c to ensure proper file handle release
-rem First verify the parser runs without errors (exit code 0)
-"%JAVACMD%" "%MAVEN_HOME%\bin\JvmConfigParser.java" "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" "%MAVEN_PROJECTBASEDIR%" >nul 2>&1
-if %ERRORLEVEL% neq 0 (
+set "JVM_CONFIG_TEMP=%TEMP%\mvn-jvm-config-%RANDOM%-%RANDOM%.txt"
+
+rem Debug logging (set MAVEN_DEBUG_SCRIPT=1 to enable)
+if defined MAVEN_DEBUG_SCRIPT (
+ echo [DEBUG] Found .mvn\jvm.config file at: %MAVEN_PROJECTBASEDIR%\.mvn\jvm.config
+ echo [DEBUG] Using temp file: %JVM_CONFIG_TEMP%
+ echo [DEBUG] Running JvmConfigParser with Java: %JAVACMD%
+ echo [DEBUG] Parser arguments: "%MAVEN_HOME%\bin\JvmConfigParser.java" "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" "%MAVEN_PROJECTBASEDIR%"
+)
+
+rem Run parser in a subshell (cmd /c) to ensure file handles are released before we read
+cmd /c ""%JAVACMD%" "%MAVEN_HOME%\bin\JvmConfigParser.java" "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" "%MAVEN_PROJECTBASEDIR%" > "%JVM_CONFIG_TEMP%" 2>&1"
+set JVM_CONFIG_EXIT=%ERRORLEVEL%
+
+if defined MAVEN_DEBUG_SCRIPT (
+ echo [DEBUG] JvmConfigParser exit code: %JVM_CONFIG_EXIT%
+)
+
+rem Check if parser failed
+if %JVM_CONFIG_EXIT% neq 0 (
echo ERROR: Failed to parse .mvn/jvm.config file 1>&2
echo jvm.config path: %MAVEN_PROJECTBASEDIR%\.mvn\jvm.config 1>&2
- "%JAVACMD%" "%MAVEN_HOME%\bin\JvmConfigParser.java" "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" "%MAVEN_PROJECTBASEDIR%" 1>&2
+ echo Java command: %JAVACMD% 1>&2
+ if exist "%JVM_CONFIG_TEMP%" (
+ echo Parser output: 1>&2
+ type "%JVM_CONFIG_TEMP%" 1>&2
+ del "%JVM_CONFIG_TEMP%" 2>nul
+ )
exit /b 1
)
-rem Run parser and capture output directly (no temp files to avoid locking issues)
-rem Using 'usebackq' to allow backtick-quoted command, 'tokens=*' to get entire line
-for /f "usebackq tokens=*" %%i in (`"%JAVACMD%" "%MAVEN_HOME%\bin\JvmConfigParser.java" "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" "%MAVEN_PROJECTBASEDIR%" 2^>nul`) do (
- set "JVM_CONFIG_MAVEN_OPTS=%%i"
+rem Read the output file
+if exist "%JVM_CONFIG_TEMP%" (
+ if defined MAVEN_DEBUG_SCRIPT (
+ echo [DEBUG] Temp file contents:
+ type "%JVM_CONFIG_TEMP%"
+ )
+ for /f "usebackq tokens=*" %%i in ("%JVM_CONFIG_TEMP%") do set "JVM_CONFIG_MAVEN_OPTS=%%i"
+ del "%JVM_CONFIG_TEMP%" 2>nul
+)
+
+if defined MAVEN_DEBUG_SCRIPT (
+ echo [DEBUG] Final JVM_CONFIG_MAVEN_OPTS: %JVM_CONFIG_MAVEN_OPTS%
)
:endReadJvmConfig
@@ -242,6 +272,25 @@ for %%i in ("%MAVEN_HOME%"\boot\plexus-classworlds-*) do set LAUNCHER_JAR="%%i"
set LAUNCHER_CLASS=org.codehaus.plexus.classworlds.launcher.Launcher
if "%MAVEN_MAIN_CLASS%"=="" @set MAVEN_MAIN_CLASS=org.apache.maven.cling.MavenCling
+if defined MAVEN_DEBUG_SCRIPT (
+ echo [DEBUG] Launching JVM with command:
+ echo [DEBUG] "%JAVACMD%"
+ echo [DEBUG] %INTERNAL_MAVEN_OPTS%
+ echo [DEBUG] %MAVEN_OPTS%
+ echo [DEBUG] %JVM_CONFIG_MAVEN_OPTS%
+ echo [DEBUG] %MAVEN_DEBUG_OPTS%
+ echo [DEBUG] --enable-native-access=ALL-UNNAMED
+ echo [DEBUG] -classpath %LAUNCHER_JAR%
+ echo [DEBUG] "-Dclassworlds.conf=%CLASSWORLDS_CONF%"
+ echo [DEBUG] "-Dmaven.home=%MAVEN_HOME%"
+ echo [DEBUG] "-Dmaven.mainClass=%MAVEN_MAIN_CLASS%"
+ echo [DEBUG] "-Dlibrary.jline.path=%MAVEN_HOME%\lib\jline-native"
+ echo [DEBUG] "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%"
+ echo [DEBUG] %LAUNCHER_CLASS%
+ echo [DEBUG] %MAVEN_ARGS%
+ echo [DEBUG] %*
+)
+
"%JAVACMD%" ^
%INTERNAL_MAVEN_OPTS% ^
%MAVEN_OPTS% ^