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 2026/10/15 21:03:05 UTC
(maven) branch backport-13478-4.0.x created (now ee4b3e9d89)
This is an automated email from the ASF dual-hosted git repository.
gnodet pushed a change to branch backport-13478-4.0.x
in repository https://gitbox.apache.org/repos/asf/maven.git
at ee4b3e9d89 fix: honour quotes in MAVEN_ARGS in bin/mvn (fix #13413)
This branch includes the following new commits:
new ee4b3e9d89 fix: honour quotes in MAVEN_ARGS in bin/mvn (fix #13413)
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
(maven) 01/01: fix: honour quotes in MAVEN_ARGS in bin/mvn (fix #13413)
Posted by gn...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
gnodet pushed a commit to branch backport-13478-4.0.x
in repository https://gitbox.apache.org/repos/asf/maven.git
commit ee4b3e9d8995e753487cf87af9c2ae86db42a4fa
Author: Arturo Bernal <ab...@apache.org>
AuthorDate: Thu Oct 15 23:00:15 2026 +0200
fix: honour quotes in MAVEN_ARGS in bin/mvn (fix #13413)
- Quote MAVEN_ARGS when passing it to the JVM so the shell preserves quoted values and does not split on spaces
- Fixes broken builds in workspaces with spaces in the path (e.g. Jenkins Pipeline Maven Plugin passing --settings or -Dmaven.repo.local)
- One side effect: shell glob expansion of unquoted patterns like * in MAVEN_ARGS is no longer performed, which is the correct behavior
- Add integration test test-mvn-args.sh (shell-script-tests profile) covering quoted values, mixed/empty words, tabs, newlines, backslash, no globbing, sub-commands, debug log — 13 of 25 assertions fail on the previous script
- Integration test runs Maven launcher directly to validate -Dmaven.repo.local with a spaced path
(cherry picked from commit 6acd660b8749fe2d30e1630e78456bea17ec8eb6)
---
apache-maven/pom.xml | 14 ++
apache-maven/src/assembly/maven/bin/mvn | 81 +++++--
apache-maven/src/test/scripts/test-mvn-args.sh | 251 +++++++++++++++++++++
.../MavenITgh13413QuotedValuesInMavenArgsTest.java | 79 +++++++
.../resources/gh-13413-maven-args-quoting/pom.xml | 30 +++
5 files changed, 441 insertions(+), 14 deletions(-)
diff --git a/apache-maven/pom.xml b/apache-maven/pom.xml
index 8d811a6899..6a1c5e15ec 100644
--- a/apache-maven/pom.xml
+++ b/apache-maven/pom.xml
@@ -492,6 +492,20 @@ under the License.
</arguments>
</configuration>
</execution>
+ <execution>
+ <id>test-mvn-args</id>
+ <goals>
+ <goal>exec</goal>
+ </goals>
+ <phase>test</phase>
+ <configuration>
+ <skip>${skipTests}</skip>
+ <executable>sh</executable>
+ <arguments>
+ <argument>${project.basedir}/src/test/scripts/test-mvn-args.sh</argument>
+ </arguments>
+ </configuration>
+ </execution>
<execution>
<id>test-mvn-jvm-config</id>
<goals>
diff --git a/apache-maven/src/assembly/maven/bin/mvn b/apache-maven/src/assembly/maven/bin/mvn
index 4727dbf63e..c6577e0dd8 100755
--- a/apache-maven/src/assembly/maven/bin/mvn
+++ b/apache-maven/src/assembly/maven/bin/mvn
@@ -23,7 +23,8 @@
# Environment Variable Prerequisites
#
# JAVA_HOME (Optional) Points to a Java installation.
-# MAVEN_ARGS (Optional) Arguments passed to Maven before CLI arguments.
+# MAVEN_ARGS (Optional) Arguments passed to Maven before CLI arguments, separated by white space.
+# Single or double quotes group a value containing white space.
# MAVEN_OPTS (Optional) Java runtime options used when Maven is executed.
# MAVEN_SKIP_RC (Optional) Flag to disable loading of mavenrc files.
# MAVEN_DEBUG_OPTS (Optional) Specify the debug options to use. Default value is "-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=${MAVEN_DEBUG_ADDRESS}" when --debug is used
@@ -388,22 +389,74 @@ cmd="\"$JAVACMD\" \
\"-Dmaven.multiModuleProjectDirectory=$MAVEN_PROJECTBASEDIR\" \
$LAUNCHER_CLASS"
+# MAVEN_ARGS is only passed for the default Maven build command (MavenCling),
+# not for sub-commands like --up, --enc, --shell or --val which have their own options.
+#
+# Its words are separated by white space, and single or double quotes group a word
+# containing white space, so that a path with a space can be passed.
+# Nothing else is interpreted: no backslash escape, no ${...} placeholder, no globbing
+# and no command substitution, so the values reach Maven as they were written.
+# A word is made of adjacent quoted and unquoted parts, and "" is an empty word.
+# The words go in front of the user arguments, "$@" is rotated to get them in order.
+if [ "$MAVEN_MAIN_CLASS" = "org.apache.maven.cling.MavenCling" ] && [ -n "$MAVEN_ARGS" ]; then
+ maven_args_user_count=$#
+ maven_args_rest=$MAVEN_ARGS
+ maven_args_word=
+ maven_args_in_word=false
+ maven_args_quote=
+ maven_args_tab=`printf '\t'`
+ maven_args_nl='
+'
+ while [ -n "$maven_args_rest" ]; do
+ maven_args_tail=${maven_args_rest#?}
+ maven_args_char=${maven_args_rest%"$maven_args_tail"}
+ maven_args_rest=$maven_args_tail
+ if [ -n "$maven_args_quote" ]; then
+ if [ "$maven_args_char" = "$maven_args_quote" ]; then
+ maven_args_quote=
+ else
+ maven_args_word=$maven_args_word$maven_args_char
+ fi
+ else
+ case $maven_args_char in
+ '"' | "'")
+ maven_args_quote=$maven_args_char
+ maven_args_in_word=true
+ ;;
+ ' ' | "$maven_args_tab" | "$maven_args_nl")
+ if [ "$maven_args_in_word" = true ]; then
+ set -- "$@" "$maven_args_word"
+ maven_args_word=
+ maven_args_in_word=false
+ fi
+ ;;
+ *)
+ maven_args_word=$maven_args_word$maven_args_char
+ maven_args_in_word=true
+ ;;
+ esac
+ fi
+ done
+ if [ -n "$maven_args_quote" ]; then
+ echo "Warning: MAVEN_ARGS has an unterminated $maven_args_quote quote, the rest of the value is treated as part of the last word" >&2
+ fi
+ if [ "$maven_args_in_word" = true ]; then
+ set -- "$@" "$maven_args_word"
+ fi
+ while [ "$maven_args_user_count" -gt 0 ]; do
+ set -- "$@" "$1"
+ shift
+ maven_args_user_count=$((maven_args_user_count - 1))
+ done
+fi
+
if [ -n "$MAVEN_DEBUG_SCRIPT" ]; then
echo "[DEBUG] Launching JVM with command:" >&2
printf '[DEBUG] %s' "$cmd" >&2
- if [ "$MAVEN_MAIN_CLASS" = "org.apache.maven.cling.MavenCling" ]; then
- printf ' %s' "$MAVEN_ARGS" >&2
- fi
printf ' "%s"' "$@" >&2; echo >&2
fi
-# User arguments ("$@") and MAVEN_ARGS are passed outside the eval'd string
-# to preserve literal values (backslashes, ${...} placeholders) without
-# shell re-parsing. Only the base command uses eval for MAVEN_OPTS word splitting.
-# MAVEN_ARGS is only passed for the default Maven build command (MavenCling),
-# not for sub-commands like --up, --enc, or --shell which have their own options.
-if [ "$MAVEN_MAIN_CLASS" = "org.apache.maven.cling.MavenCling" ]; then
- eval exec "$cmd" '$MAVEN_ARGS' '"$@"'
-else
- eval exec "$cmd" '"$@"'
-fi
+# The arguments ("$@") are passed outside the eval'd string to preserve literal
+# values (backslashes, ${...} placeholders) without shell re-parsing.
+# Only the base command uses eval for MAVEN_OPTS word splitting.
+eval exec "$cmd" '"$@"
diff --git a/apache-maven/src/test/scripts/test-mvn-args.sh b/apache-maven/src/test/scripts/test-mvn-args.sh
new file mode 100644
index 0000000000..8e90ffd9da
--- /dev/null
+++ b/apache-maven/src/test/scripts/test-mvn-args.sh
@@ -0,0 +1,251 @@
+#!/bin/sh
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+# -----------------------------------------------------------------------------
+# Tests how bin/mvn hands the MAVEN_ARGS environment variable over to Maven.
+#
+# The test runs on any POSIX platform: a throw-away Maven home is populated with
+# the real bin/mvn, and uname(1), dirname(1) and java(1) are stubbed out so that
+# the JVM command line can be asserted upon, one bracketed token per argument.
+#
+# The launcher is always run with a PATH holding nothing but those stubs, so it
+# may only rely on shell built-ins, as the stubs themselves do.
+#
+# Usage: sh apache-maven/src/test/scripts/test-mvn-args.sh
+#
+# Exits with 0 when all assertions pass, 1 otherwise.
+# -----------------------------------------------------------------------------
+
+set -e
+
+script_dir=`cd "\`dirname "$0"\`" && pwd`
+mvn_script="$script_dir/../../assembly/maven/bin/mvn"
+
+if [ ! -f "$mvn_script" ]; then
+ echo "Cannot locate the mvn script at $mvn_script" >&2
+ exit 1
+fi
+
+# Absolute path to the shell: it has to be invoked while PATH holds the stubs only.
+sh_bin=`unset -f command; command -v sh`
+
+work_dir=`mktemp -d "${TMPDIR:-/tmp}/mvn-args.XXXXXX"`
+work_dir=`cd "$work_dir" && pwd`
+trap 'rm -rf "$work_dir"' EXIT INT TERM
+
+stub_dir="$work_dir/stubs"
+maven_home="$work_dir/maven-home"
+project_dir="$work_dir/project"
+
+mkdir -p "$stub_dir" "$maven_home/bin" "$maven_home/boot" "$project_dir"
+
+cp "$mvn_script" "$maven_home/bin/mvn"
+touch "$maven_home/bin/m2.conf" "$maven_home/boot/plexus-classworlds-9.9.9.jar"
+
+# Files matching a glob, to prove that MAVEN_ARGS is never expanded as a pattern.
+touch "$project_dir/one.txt" "$project_dir/two.txt"
+
+cat > "$stub_dir/uname" <<'STUB'
+#!/bin/sh
+echo Linux
+STUB
+
+# dirname(1) stub: bin/mvn needs it to locate the Maven home.
+cat > "$stub_dir/dirname" <<'STUB'
+#!/bin/sh
+path="$1"
+case "$path" in
+ */*)
+ path="${path%/*}"
+ [ -n "$path" ] || path="/"
+ ;;
+ *) path="." ;;
+esac
+printf '%s\n' "$path"
+STUB
+
+# java(1) stub: answers version probes, otherwise echoes the arguments it was
+# invoked with, one bracketed token per argument.
+cat > "$stub_dir/java" <<'STUB'
+#!/bin/sh
+case " $* " in
+ *" -version "*) exit 0 ;;
+esac
+
+for arg in "$@"; do printf '[%s]' "$arg"; done
+printf '\n'
+STUB
+
+chmod +x "$stub_dir/uname" "$stub_dir/dirname" "$stub_dir/java" "$maven_home/bin/mvn"
+
+failures=0
+
+# The text following the launcher class: the arguments Maven itself receives.
+launcher='[org.codehaus.plexus.classworlds.launcher.Launcher]'
+
+# maven_args <MAVEN_ARGS value> [args...]
+# Prints the arguments handed over to Maven.
+maven_args() {
+ value="$1"
+ shift
+ output=`cd "$project_dir" &&
+ MAVEN_ARGS="$value" PATH="$stub_dir" JAVA_HOME= MAVEN_SKIP_RC=1 \
+ "$sh_bin" "$maven_home/bin/mvn" "$@" 2>/dev/null || :`
+ printf '%s' "${output#*"$launcher"}"
+}
+
+# maven_args_stderr <MAVEN_ARGS value> [args...]
+# Prints what the launcher wrote to the standard error.
+maven_args_stderr() {
+ value="$1"
+ shift
+ ( cd "$project_dir" &&
+ MAVEN_ARGS="$value" PATH="$stub_dir" JAVA_HOME= MAVEN_SKIP_RC=1 \
+ "$sh_bin" "$maven_home/bin/mvn" "$@" 2>&1 >/dev/null || : )
+}
+
+# assert_equals <description> <expected> <actual>
+assert_equals() {
+ if [ "$2" = "$3" ]; then
+ printf 'ok - %s\n' "$1"
+ else
+ printf 'FAILED - %s\n' "$1"
+ printf ' expected: %s\n' "$2"
+ printf ' actual: %s\n' "$3"
+ failures=$((failures + 1))
+ fi
+}
+
+# assert_contains <description> <haystack> <needle>
+assert_contains() {
+ case "$2" in
+ *"$3"*) printf 'ok - %s\n' "$1" ;;
+ *)
+ printf 'FAILED - %s\n' "$1"
+ printf ' expected to contain: %s\n' "$3"
+ printf ' actual: %s\n' "$2"
+ failures=$((failures + 1))
+ ;;
+ esac
+}
+
+# check <description> <expected> <MAVEN_ARGS value> [args...]
+check() {
+ description="$1"
+ expected="$2"
+ value="$3"
+ shift 3
+ actual=`maven_args "$value" "$@"`
+ assert_equals "$description" "$expected" "$actual"
+}
+
+nl='
+'
+tab=`printf '\t'`
+dq='"'
+sq="'"
+
+check "no MAVEN_ARGS: only the command line arguments" \
+ '[validate]' '' validate
+
+check "white space only: no argument" \
+ '[validate]' ' ' validate
+
+check "white space in quotes is an argument of its own" \
+ '[ ][validate]' "${sq} ${sq}" validate
+
+check "plain words are split on white space" \
+ '[-B][-X][validate]' '-B -X' validate
+
+check "any amount of white space separates the words" \
+ '[-B][-X][validate]' ' -B -X ' validate
+
+check "tabs and new lines separate the words" \
+ '[-B][-X][-V][validate]' "-B${tab}-X${nl}-V" validate
+
+check "double quotes keep a path with a space in one word (#13413)" \
+ '[-Dmaven.repo.local=/path with space/repo][validate]' \
+ "${dq}-Dmaven.repo.local=/path with space/repo${dq}" validate
+
+check "single quotes keep a path with a space in one word" \
+ '[--settings][/path with space/settings.xml][validate]' \
+ "--settings ${sq}/path with space/settings.xml${sq}" validate
+
+check "quoted and unquoted parts of a word are joined" \
+ '[-Dname=John Smith Jr][validate]' \
+ "-Dname=${dq}John Smith${dq}${sq} Jr${sq}" validate
+
+check "the other kind of quote is kept inside a quoted word" \
+ "[-Dmessage=it's fine][-Dother=say \"hi\"][validate]" \
+ "${dq}-Dmessage=it${sq}s fine${dq} ${sq}-Dother=say ${dq}hi${dq}${sq}" validate
+
+check "an empty quoted word is an empty argument" \
+ '[-Dkey=][][validate]' "-Dkey= ${dq}${dq}" validate
+
+check "MAVEN_ARGS comes before the command line arguments, which stay untouched" \
+ '[-B][-Dfoo=a b][first arg][second][validate]' \
+ "-B ${dq}-Dfoo=a b${dq}" 'first arg' second validate
+
+check "a pattern is not expanded" \
+ '[-pl][*.txt][validate]' '-pl *.txt' validate
+
+check "a pattern in quotes is not expanded either" \
+ '[-pl][*.txt][validate]' "-pl ${dq}*.txt${dq}" validate
+
+check "backslashes are kept as they are" \
+ '[-Dpath=C:\temp\repo][validate]' '-Dpath=C:\temp\repo' validate
+
+check "placeholders are kept as they are" \
+ '[-Dbase=${project.basedir}][-Dhome=$HOME][validate]' \
+ '-Dbase=${project.basedir} -Dhome=$HOME' validate
+
+check "no command is substituted" \
+ '[-Dx=$(echo][hi)][-Dy=`echo][hi`][validate]' \
+ '-Dx=$(echo hi) -Dy=`echo hi`' validate
+
+check "no command is run when quoted" \
+ '[-Dx=$(echo hi)][validate]' "${dq}-Dx=\$(echo hi)${dq}" validate
+
+check "an unterminated quote makes the rest of the value part of the last word" \
+ '[-Dx=a b][validate]' "-Dx=${dq}a b" validate
+
+stderr=`maven_args_stderr "-Dx=${dq}a b" validate`
+assert_contains "an unterminated quote is reported" \
+ "$stderr" "Warning: MAVEN_ARGS has an unterminated ${dq} quote"
+
+# Only the default Maven build command takes MAVEN_ARGS, --up, --enc, --shell and
+# --val have their own options.
+for command in --up --enc --shell --val; do
+ check "$command: MAVEN_ARGS is not passed" \
+ "[$command]" "-B ${dq}-Dfoo=a b${dq}" "$command"
+done
+
+# The debug log shows the arguments the way they are handed over.
+debug_output=`cd "$project_dir" &&
+ MAVEN_ARGS="-B ${dq}-Dfoo=a b${dq}" PATH="$stub_dir" JAVA_HOME= MAVEN_SKIP_RC=1 \
+ MAVEN_DEBUG_SCRIPT=1 "$sh_bin" "$maven_home/bin/mvn" validate 2>&1 >/dev/null`
+assert_contains "debug log: MAVEN_ARGS words are shown one by one" \
+ "$debug_output" ' "-B" "-Dfoo=a b" "validate"'
+
+if [ "$failures" -ne 0 ]; then
+ printf '%s assertion(s) failed\n' "$failures"
+ exit 1
+fi
+
+printf 'All assertions passed\n'
diff --git a/its/core-it-suite/src/test/java/org/apache/maven/it/MavenITgh13413QuotedValuesInMavenArgsTest.java b/its/core-it-suite/src/test/java/org/apache/maven/it/MavenITgh13413QuotedValuesInMavenArgsTest.java
new file mode 100644
index 0000000000..0fde01afc8
--- /dev/null
+++ b/its/core-it-suite/src/test/java/org/apache/maven/it/MavenITgh13413QuotedValuesInMavenArgsTest.java
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.maven.it;
+
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.List;
+import java.util.Locale;
+import java.util.concurrent.TimeUnit;
+
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+/**
+ * This is a test set for <a href="https://github.com/apache/maven/issues/13413">gh-13413</a>:
+ * a value with white space which is quoted in {@code MAVEN_ARGS}, like a path with a space for
+ * {@code -Dmaven.repo.local}, must reach Maven as a single argument.
+ * <p>
+ * The launcher script is run directly, and not through the executor of the test harness, because that executor
+ * splits {@code MAVEN_ARGS} itself and does not pass it on to the script. On Windows this runs {@code mvn.cmd}.
+ */
+class MavenITgh13413QuotedValuesInMavenArgsTest extends AbstractMavenIntegrationTestCase {
+
+ @Test
+ void testQuotedValueWithSpace() throws Exception {
+ Path basedir = extractResources("gh-13413-maven-args-quoting");
+ // a path with a space, as the Jenkins Pipeline Maven plugin builds for a workspace like that
+ Path localRepo = basedir.resolve("local repo");
+
+ boolean windows = System.getProperty("os.name", "").toLowerCase(Locale.ROOT).startsWith("windows");
+ Path bin = Path.of(System.getProperty("maven.home")).resolve("bin");
+ List<String> command = windows
+ ? List.of("cmd.exe", "/c", bin.resolve("mvn.cmd").toString(), "-B", "validate")
+ : List.of(bin.resolve("mvn").toString(), "-B", "validate");
+
+ // the output goes to a file, so that waiting for the end of Maven is what the timeout applies to
+ Path log = basedir.resolve("mvn-output.txt");
+ ProcessBuilder builder = new ProcessBuilder(command)
+ .directory(basedir.toFile())
+ .redirectErrorStream(true)
+ .redirectOutput(log.toFile());
+ builder.environment().put("MAVEN_ARGS", "\"-Dmaven.repo.local=" + localRepo + "\" -Dprop.plain=plain");
+ builder.environment().put("MAVEN_SKIP_RC", "true");
+ builder.environment().remove("MAVEN_OPTS");
+ builder.environment().remove("MAVEN_CONFIG");
+ Process process = builder.start();
+ boolean ended = process.waitFor(2, TimeUnit.MINUTES);
+ if (!ended) {
+ process.destroyForcibly();
+ }
+ String output = new String(Files.readAllBytes(log), StandardCharsets.UTF_8);
+
+ assertTrue(ended, "Maven did not end in time:\n" + output);
+ assertEquals(0, process.exitValue(), output);
+ assertTrue(output.contains("BUILD SUCCESS"), output);
+ // Maven created the local repository at the path with the space, so that MAVEN_ARGS was not ignored
+ assertTrue(Files.isDirectory(localRepo), "No local repository at " + localRepo + ":\n" + output);
+ }
+}
diff --git a/its/core-it-suite/src/test/resources/gh-13413-maven-args-quoting/pom.xml b/its/core-it-suite/src/test/resources/gh-13413-maven-args-quoting/pom.xml
new file mode 100644
index 0000000000..3b1b8f20c4
--- /dev/null
+++ b/its/core-it-suite/src/test/resources/gh-13413-maven-args-quoting/pom.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>org.apache.maven.its.gh13413</groupId>
+ <artifactId>test</artifactId>
+ <version>1.0</version>
+ <packaging>pom</packaging>
+
+ <name>Maven Integration Test :: GH-13413</name>
+ <description>Verify that a quoted value with white space in MAVEN_ARGS reaches Maven as one argument.</description>
+</project>