Reputation: 10413
I need to use maven with a settings file in a specific location, normally you can give MAVEN_OPTS
env variable but they are passed to JVM so the following will yield:
$ MAVEN_OPTS="-s /settings.xml"
$ mvn clean
Unrecognized option: -s
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
I searched a lot but found two keys, org.apache.maven.user-settings
and org.apache.maven.global-settings
which is explained here but it seemed it was working with Maven 2 only. Aliasing mvn
to mvn -s /settings.xml
would probably work but I do not like it.
Upvotes: 9
Views: 13667
Reputation: 28909
The MAVEN_ARGS
environment variable is supported and can be used.
The MAVEN_ARGS
environment variable is implemented in Maven 3, starting with version 3.9.0 and can be used if you have sufficiently new version of maven.
There was a feature request MNG-5824: Support MAVEN_ARGS
environment variable as a way of supplying default command line arguments. This was closed unimplemented with a suggestion to use the .mvn/maven.config
in project directory, which indeed works and can also solve the problem.
Upvotes: 8
Reputation: 1263
If (and only if) you are using Maven Wrapper, you can set
export MAVEN_CONFIG="-s /path/to/settings.xml
MAVEN_ARGS
did not work for me even with Maven Version >= 3.9.0.
Upvotes: 1
Reputation: 75426
From the mvn
shell script:
# -----------------------------------------------------------------------------
# Apache Maven Startup Script
#
# Environment Variable Prerequisites
#
# JAVA_HOME Must point at your Java Development Kit installation.
# MAVEN_OPTS (Optional) Java runtime options used when Maven is executed.
# MAVEN_SKIP_RC (Optional) Flag to disable loading of mavenrc files.
# -----------------------------------------------------------------------------
so MAVEN_OPTS contains JVM arguments, not Maven arguments (which is consistent with the error message indicating the JVM doesn't like your arguments).
The actual invocation is
exec "$JAVACMD" \
$MAVEN_OPTS \
$MAVEN_DEBUG_OPTS \
-classpath "${CLASSWORLDS_JAR}" \
"-Dclassworlds.conf=${MAVEN_HOME}/bin/m2.conf" \
"-Dmaven.home=${MAVEN_HOME}" \
"-Dlibrary.jansi.path=${MAVEN_HOME}/lib/jansi-native" \
"-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
${CLASSWORLDS_LAUNCHER} "$@"
so there is nowhere to put it. I would therefore suggest that you write your own ? mvn
script which in turn calls the real maven command with the arguments you like (in my experience scripts are more robust than aliases). Additionally I have recently found myself that the Java versions later than 8 have ... interesting issues... so I really need to have mvn8
, mvn11
(and perhaps more) commands anyway.
Another approach that I only started using recently is the Maven wrapper (https://github.com/takari/maven-wrapper) where a ./mvnw
command is placed in your project which then downloads Maven when needed. This is very useful. To get started use
mvn -N io.takari:maven:wrapper
after which ./mvnw
should be directly usable instead of mvn
. The interesting part here is that the generated Maven command looks like
exec "$JAVACMD" \
$MAVEN_OPTS \
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
"-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
and MAVEN_CONFIG is not set earlier in the script. So for mvnw
you can set MAVEN_CONFIG to your "-s /settings.xml" string.
Upvotes: 7