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 <[email protected]>
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% ^

Reply via email to