Repository: maven
Updated Branches:
refs/heads/project-basedir 888109c68 -> e91144fbe (forced update)
.mvn/ for project specific jvm options and maven parameters
Signed-off-by: Igor Fedorenko <ifedore...@apache.org>
Project: http://git-wip-us.apache.org/repos/asf/maven/repo
Commit: http://git-wip-us.apache.org/repos/asf/maven/commit/e91144fb
Tree: http://git-wip-us.apache.org/repos/asf/maven/tree/e91144fb
Diff: http://git-wip-us.apache.org/repos/asf/maven/diff/e91144fb
Branch: refs/heads/project-basedir
Commit: e91144fbed65c797abb615f1cbcc838271ff36f4
Parents: d745f8c
Author: Igor Fedorenko <ifedore...@apache.org>
Authored: Mon Jan 26 14:22:05 2015 -0500
Committer: Igor Fedorenko <ifedore...@apache.org>
Committed: Fri Feb 6 15:43:40 2015 -0500
----------------------------------------------------------------------
apache-maven/src/bin/.gitattributes | 1 +
apache-maven/src/bin/mvn | 8 ++-
apache-maven/src/bin/mvn-common.sh | 43 ++++++++++++++
apache-maven/src/bin/mvnDebug | 8 ++-
apache-maven/src/bin/mvnyjp | 23 ++++----
apache-maven/src/main/assembly/bin.xml | 1 +
.../execution/DefaultMavenExecutionRequest.java | 14 +++++
.../maven/execution/MavenExecutionRequest.java | 9 +++
.../java/org/apache/maven/cli/MavenCli.java | 57
++++++++++++++++++-
.../java/org/apache/maven/cli/MavenCliTest.java | 59
++++++++++++++++++++
.../projects/config-illegal/.mvn/maven.config | 1 +
.../src/test/projects/config/.mvn/maven.config | 2 +
12 files changed, 207 insertions(+), 19 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/apache-maven/src/bin/.gitattributes
----------------------------------------------------------------------
diff --git a/apache-maven/src/bin/.gitattributes
b/apache-maven/src/bin/.gitattributes
index cc7533f..90eeece 100644
--- a/apache-maven/src/bin/.gitattributes
+++ b/apache-maven/src/bin/.gitattributes
@@ -1,3 +1,4 @@
mvn eol=lf crlf=input
mvnDebug eol=lf crlf=input
mvnyjp eol=lf crlf=input
+mvn-common.sh eol=lf crlf=input
http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/apache-maven/src/bin/mvn
----------------------------------------------------------------------
diff --git a/apache-maven/src/bin/mvn b/apache-maven/src/bin/mvn
index 1ed3024..f745f4e 100755
--- a/apache-maven/src/bin/mvn
+++ b/apache-maven/src/bin/mvn
@@ -189,14 +189,18 @@ if $cygwin; then
CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
fi
+. "$M2_HOME/bin/mvn-common.sh"
+export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-$(find_maven_basedir)}
+MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config")
$MAVEN_OPTS"
+
# Provide a "standardized" way to retrieve the CLI args that will
# work with both Windows and non-Windows executions.
-MAVEN_CMD_LINE_ARGS="$@"
+MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
export MAVEN_CMD_LINE_ARGS
exec "$JAVACMD" \
$MAVEN_OPTS \
-classpath "${M2_HOME}"/boot/plexus-classworlds-*.jar \
"-Dclassworlds.conf=${M2_HOME}/bin/m2.conf" \
- "-Dmaven.home=${M2_HOME}" \
+ "-Dmaven.home=${M2_HOME}"
"-Dmaven.projectBasedir=${MAVEN_PROJECTBASEDIR}" \
${CLASSWORLDS_LAUNCHER} "$@"
http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/apache-maven/src/bin/mvn-common.sh
----------------------------------------------------------------------
diff --git a/apache-maven/src/bin/mvn-common.sh
b/apache-maven/src/bin/mvn-common.sh
new file mode 100755
index 0000000..b39741b
--- /dev/null
+++ b/apache-maven/src/bin/mvn-common.sh
@@ -0,0 +1,43 @@
+#!/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.
+#
----------------------------------------------------------------------------
+
+# TODO ideally, this should contain all logic common to mvn* shell
scripts
+
+# traverses directory structure from process work directory to
filesystem root
+# first directory with .mvn subdirectory is considered project base
directory
+find_maven_basedir() {
+ local basedir=$(pwd)
+ local wdir=$(pwd)
+ while [ "$wdir" != '/' ] ; do
+ wdir=$(cd $wdir/..; pwd)
+ if [ -d "$wdir"/.mvn ] ; then
+ basedir=$wdir
+ break
+ fi
+ done
+ echo "${basedir}"
+}
+
+# concatenates all lines of a file
+concat_lines() {
+ if [ -f "$1" ]; then
+ echo "$(tr -s '\n' ' ' < "$1")"
+ fi
+}
http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/apache-maven/src/bin/mvnDebug
----------------------------------------------------------------------
diff --git a/apache-maven/src/bin/mvnDebug
b/apache-maven/src/bin/mvnDebug
index 291f81f..287d20b 100755
--- a/apache-maven/src/bin/mvnDebug
+++ b/apache-maven/src/bin/mvnDebug
@@ -193,9 +193,13 @@ if $cygwin; then
CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
fi
+. "$M2_HOME/bin/mvn-common.sh"
+export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-$(find_maven_basedir)}
+MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config")
$MAVEN_OPTS"
+
# Provide a "standardized" way to retrieve the CLI args that will
# work with both Windows and non-Windows executions.
-MAVEN_CMD_LINE_ARGS="$@"
+MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
export MAVEN_CMD_LINE_ARGS
exec "$JAVACMD" \
@@ -203,5 +207,5 @@ exec "$JAVACMD" \
$MAVEN_DEBUG_OPTS \
-classpath "${M2_HOME}"/boot/plexus-classworlds-*.jar \
"-Dclassworlds.conf=${M2_HOME}/bin/m2.conf" \
- "-Dmaven.home=${M2_HOME}" \
+ "-Dmaven.home=${M2_HOME}"
"-Dmaven.projectBasedir=${MAVEN_PROJECTBASEDIR}" \
${CLASSWORLDS_LAUNCHER} "$@"
http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/apache-maven/src/bin/mvnyjp
----------------------------------------------------------------------
diff --git a/apache-maven/src/bin/mvnyjp b/apache-maven/src/bin/mvnyjp
index faf3412..6d5f555 100755
--- a/apache-maven/src/bin/mvnyjp
+++ b/apache-maven/src/bin/mvnyjp
@@ -34,14 +34,6 @@
# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
#
----------------------------------------------------------------------------
-QUOTED_ARGS=""
-while [ "$1" != "" ] ; do
-
- QUOTED_ARGS="$QUOTED_ARGS \"$1\""
- shift
-
-done
-
if [ -z "$MAVEN_SKIP_RC" ] ; then
if [ -f /etc/mavenrc ] ; then
@@ -204,11 +196,18 @@ fi
MAVEN_OPTS="-agentpath:$YJPLIB=onexit=snapshot,onexit=memory,tracing,onlylocal
$MAVEN_OPTS"
+. "$M2_HOME/bin/mvn-common.sh"
+export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-$(find_maven_basedir)}
+MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config")
$MAVEN_OPTS"
+
+# Provide a "standardized" way to retrieve the CLI args that will
+# work with both Windows and non-Windows executions.
+MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
+export MAVEN_CMD_LINE_ARGS
+
exec "$JAVACMD" \
$MAVEN_OPTS \
-classpath "${M2_HOME}"/boot/plexus-classworlds-*.jar \
"-Dclassworlds.conf=${M2_HOME}/bin/m2.conf" \
- "-Dmaven.home=${M2_HOME}" \
- ${CLASSWORLDS_LAUNCHER} $QUOTED_ARGS
-
-
+ "-Dmaven.home=${M2_HOME}"
"-Dmaven.projectBasedir=${MAVEN_PROJECTBASEDIR}" \
+ ${CLASSWORLDS_LAUNCHER} "$@"
http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/apache-maven/src/main/assembly/bin.xml
----------------------------------------------------------------------
diff --git a/apache-maven/src/main/assembly/bin.xml
b/apache-maven/src/main/assembly/bin.xml
index b2aa900..6b862f8 100644
--- a/apache-maven/src/main/assembly/bin.xml
+++ b/apache-maven/src/main/assembly/bin.xml
@@ -74,6 +74,7 @@ under the License.
<outputDirectory>bin</outputDirectory>
<includes>
<include>m2</include>
+ <include>mvn-common.sh</include>
<include>mvn</include>
<include>mvnDebug</include>
<!-- This is so that CI systems can periodically run the
profiler -->
http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/maven-core/src/main/java/org/apache/maven/execution/DefaultMavenExecutionRequest.java
----------------------------------------------------------------------
diff --git
a/maven-core/src/main/java/org/apache/maven/execution/DefaultMavenExecutionRequest.java
b/maven-core/src/main/java/org/apache/maven/execution/DefaultMavenExecutionRequest.java
index d88024d..f4439b1 100644
---
a/maven-core/src/main/java/org/apache/maven/execution/DefaultMavenExecutionRequest.java
+++
b/maven-core/src/main/java/org/apache/maven/execution/DefaultMavenExecutionRequest.java
@@ -93,6 +93,8 @@ public class DefaultMavenExecutionRequest
// Request
//
----------------------------------------------------------------------------
+ private File projectBasedir;
+
private File basedir;
private List<String> goals;
@@ -1149,4 +1151,16 @@ public class DefaultMavenExecutionRequest
this.toolchains = toolchains;
return this;
}
+
+ @Override
+ public void setProjectBaseDirectory( File directory )
+ {
+ this.projectBasedir = directory;
+ }
+
+ @Override
+ public File getProjectBaseDirectory()
+ {
+ return projectBasedir;
+ }
}
http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/maven-core/src/main/java/org/apache/maven/execution/MavenExecutionRequest.java
----------------------------------------------------------------------
diff --git
a/maven-core/src/main/java/org/apache/maven/execution/MavenExecutionRequest.java
b/maven-core/src/main/java/org/apache/maven/execution/MavenExecutionRequest.java
index 15e2082..0591440 100644
---
a/maven-core/src/main/java/org/apache/maven/execution/MavenExecutionRequest.java
+++
b/maven-core/src/main/java/org/apache/maven/execution/MavenExecutionRequest.java
@@ -411,4 +411,13 @@ public interface MavenExecutionRequest
*/
Map<String, List<ToolchainModel>> getToolchains();
+ /**
+ * @since 3.2.6
+ */
+ void setProjectBaseDirectory( File file );
+
+ /**
+ * @since 3.2.6
+ */
+ File getProjectBaseDirectory();
}
http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java
----------------------------------------------------------------------
diff --git
a/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java
b/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java
index 5b7bd7f..d04cbe0 100644
--- a/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java
+++ b/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java
@@ -23,8 +23,10 @@ import java.io.Console;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
+import java.io.IOException;
import java.io.PrintStream;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@@ -91,6 +93,8 @@ import
org.sonatype.plexus.components.sec.dispatcher.SecDispatcher;
import org.sonatype.plexus.components.sec.dispatcher.SecUtil;
import
org.sonatype.plexus.components.sec.dispatcher.model.SettingsSecurity;
+import com.google.common.base.Charsets;
+import com.google.common.io.Files;
import com.google.inject.AbstractModule;
// TODO: push all common bits back to plexus cli and prepare for
transition to Guice. We don't need 50 ways to make CLIs
@@ -105,6 +109,8 @@ public class MavenCli
public static final String THREADS_DEPRECATED =
"maven.threads.experimental";
+ public static final String PROJECT_BASEDIR =
"maven.projectBasedir";
+
@SuppressWarnings( "checkstyle:constantname" )
public static final String userHome = System.getProperty(
"user.home" );
@@ -256,13 +262,27 @@ public class MavenCli
}
}
- private void initialize( CliRequest cliRequest )
+ void initialize( CliRequest cliRequest )
{
if ( cliRequest.workingDirectory == null )
{
cliRequest.workingDirectory = System.getProperty(
"user.dir" );
}
+ if ( cliRequest.projectBaseDirectory == null )
+ {
+ String basedirProperty = System.getProperty(
PROJECT_BASEDIR );
+ File basedir = basedirProperty != null ? new File(
basedirProperty ) : new File( "" );
+ try
+ {
+ cliRequest.projectBaseDirectory =
basedir.getCanonicalFile();
+ }
+ catch ( IOException e )
+ {
+ cliRequest.projectBaseDirectory =
basedir.getAbsoluteFile();
+ }
+ }
+
//
// Make sure the Maven home directory is an absolute path to
save us from confusion with say drive-relative
// Windows paths.
@@ -275,7 +295,7 @@ public class MavenCli
}
}
- private void cli( CliRequest cliRequest )
+ void cli( CliRequest cliRequest )
throws Exception
{
//
@@ -286,9 +306,38 @@ public class MavenCli
CLIManager cliManager = new CLIManager();
+ List<String> args = new ArrayList<String>();
+
+ try
+ {
+ File configFile = new File(
cliRequest.projectBaseDirectory, ".mvn/maven.config" );
+
+ if ( configFile.isFile() )
+ {
+ for ( String arg : Files.toString( configFile,
Charsets.UTF_8 ).split( "\\s+" ) )
+ {
+ args.add( arg );
+ }
+
+ CommandLine config = cliManager.parse( args.toArray(
new String[args.size()] ) );
+ List<?> unrecongized = config.getArgList();
+ if ( !unrecongized.isEmpty() )
+ {
+ throw new ParseException( "Unrecognized
maven.config entries: " + unrecongized );
+ }
+ }
+ }
+ catch ( ParseException e )
+ {
+ System.err.println( "Unable to parse maven.config: " +
e.getMessage() );
+ cliManager.displayHelp( System.out );
+ throw e;
+ }
+
try
{
- cliRequest.commandLine = cliManager.parse(
cliRequest.args );
+ args.addAll( 0, Arrays.asList( cliRequest.args ) );
+ cliRequest.commandLine = cliManager.parse( args.toArray(
new String[args.size()] ) );
}
catch ( ParseException e )
{
@@ -1070,6 +1119,7 @@ public class MavenCli
.setUpdateSnapshots( updateSnapshots ) // default: false
.setNoSnapshotUpdates( noSnapshotUpdates ) // default:
false
.setGlobalChecksumPolicy( globalChecksumPolicy ) //
default: warn
+ .setProjectBaseDirectory(
cliRequest.projectBaseDirectory )
;
if ( alternatePomFile != null )
@@ -1319,6 +1369,7 @@ public class MavenCli
CommandLine commandLine;
ClassWorld classWorld;
String workingDirectory;
+ File projectBaseDirectory;
boolean debug;
boolean quiet;
boolean showErrors = true;
http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/maven-embedder/src/test/java/org/apache/maven/cli/MavenCliTest.java
----------------------------------------------------------------------
diff --git
a/maven-embedder/src/test/java/org/apache/maven/cli/MavenCliTest.java
b/maven-embedder/src/test/java/org/apache/maven/cli/MavenCliTest.java
index 6e06cc5..628ef20 100644
---
a/maven-embedder/src/test/java/org/apache/maven/cli/MavenCliTest.java
+++
b/maven-embedder/src/test/java/org/apache/maven/cli/MavenCliTest.java
@@ -19,16 +19,39 @@ package org.apache.maven.cli;
* under the License.
*/
+import java.io.File;
+
import junit.framework.TestCase;
+import org.apache.commons.cli.ParseException;
+import org.apache.maven.cli.MavenCli.CliRequest;
+
public class MavenCliTest
extends TestCase
{
private MavenCli cli;
+ private String origBasedir;
+
protected void setUp()
{
cli = new MavenCli();
+ origBasedir = System.getProperty( MavenCli.PROJECT_BASEDIR );
+ }
+
+ @Override
+ protected void tearDown()
+ throws Exception
+ {
+ if ( origBasedir != null )
+ {
+ System.setProperty( MavenCli.PROJECT_BASEDIR,
origBasedir );
+ }
+ else
+ {
+ System.getProperties().remove( MavenCli.PROJECT_BASEDIR );
+ }
+ super.tearDown();
}
public void testCalculateDegreeOfConcurrencyWithCoreMultiplier()
@@ -49,4 +72,40 @@ public class MavenCliTest
// carry on
}
}
+
+ public void testMavenConfig()
+ throws Exception
+ {
+ System.setProperty( MavenCli.PROJECT_BASEDIR, new File(
"src/test/projects/config" ).getCanonicalPath() );
+ CliRequest request = new CliRequest( new String[0], null );
+
+ // read .mvn/maven.config
+ cli.initialize( request );
+ cli.cli( request );
+ assertEquals( "multithreaded",
request.commandLine.getOptionValue( "builder" ) );
+ assertEquals( "8", request.commandLine.getOptionValue(
"threads" ) );
+
+ // override from command line
+ request = new CliRequest( new String[] { "--builder",
"foobar" }, null );
+ cli.cli( request );
+ assertEquals( "foobar", request.commandLine.getOptionValue(
"builder" ) );
+ }
+
+ public void testMavenConfigInvalid()
+ throws Exception
+ {
+ System.setProperty( MavenCli.PROJECT_BASEDIR, new File(
"src/test/projects/config-illegal" ).getCanonicalPath() );
+ CliRequest request = new CliRequest( new String[0], null );
+
+ cli.initialize( request );
+ try
+ {
+ cli.cli( request );
+ fail();
+ }
+ catch ( ParseException expected )
+ {
+
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/maven-embedder/src/test/projects/config-illegal/.mvn/maven.config
----------------------------------------------------------------------
diff --git
a/maven-embedder/src/test/projects/config-illegal/.mvn/maven.config
b/maven-embedder/src/test/projects/config-illegal/.mvn/maven.config
new file mode 100644
index 0000000..8541464
--- /dev/null
+++ b/maven-embedder/src/test/projects/config-illegal/.mvn/maven.config
@@ -0,0 +1 @@
+deploy
http://git-wip-us.apache.org/repos/asf/maven/blob/e91144fb/maven-embedder/src/test/projects/config/.mvn/maven.config
----------------------------------------------------------------------
diff --git a/maven-embedder/src/test/projects/config/.mvn/maven.config
b/maven-embedder/src/test/projects/config/.mvn/maven.config
new file mode 100644
index 0000000..3d0f13b
--- /dev/null
+++ b/maven-embedder/src/test/projects/config/.mvn/maven.config
@@ -0,0 +1,2 @@
+-T8 --builder
+ multithreaded