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% ^
