Technically the reactor right now are the projects in modules from where you start the build.
I think what this variable is trying to represent is the base directory of the multi-module project. I would argue that, ultimately, the reactor base directory should be the same as the multi-module project base directory but they are not. I would also argue that the reactor should always contain all the projects as if you started the build from the multi-module project but this is also not the case which I believe is highly confusing the users because they expect the in-situ build results to be used. At least from my un-scientific polling from a few hundred users. But whether there is one project or many what we are trying to express here is the multi-module project base directory and I think we need a concept for this so this would be a good place to start. How about multiModuleProjectBaseDirectory? Lengthly but I think it's clear. On Feb 21, 2015, at 8:57 AM, Robert Scholte <[email protected]> wrote: > Op Sat, 21 Feb 2015 14:12:22 +0100 schreef Igor Fedorenko > <[email protected]>: > >> >> On 2015-02-21 7:02, Robert Scholte wrote: >>> Hi Igor, >>> >>> I agree that something like MNG-5767 can indeed help with the experience. >>> >>> Looking at the implementation I find the name projectBaseDirectory >>> confusing, I would have thought that this is a per project(module) >>> baseDirectory. >>> We already have things like project.basedir and project.executionRoot >>> Couldn't you (re)use the executionRoot, which seems to be exactly what >>> you want. >>> I just think that projectBaseDirectory is too abstract, I'd prefer a >>> more concrete name. >>> >> >> MavenSession#executionRoot is normally set to user work directory. For >> example, consider typical multimodule project >> >> project <= the new "basedir" I need to introduce >> |- pom.xml >> |- moduleA <= executionRoot == user.home >> | \- pom.xml >> \- moduleB >> \- pom.xml >> >> When the user executes the build from project/moduleA directory, session >> execution root will be set to project/moduleA directory. The new >> "basedir" I need to introduce must always point at the root of the >> project source tree, regardless where the build is started. > > > Are you sure this will work? > IIRC there's a difference between > project> mvn <phase> -pl :moduleA (here's the executionRoot project/ , > right?) > and > project/moduleA> mvn <phase> > > You should not assume that module-parent and children always point to each > other. > MNG-4324[1] is a feature request which is very related to your issue: Find > the real root. And is is tricky :) > Once MNG-4324 is fixed, your issue is a simple enhancement on it. > How about reactorBaseDirectory/reactorRootDirectory? > > thanks, > Robert > > [1] https://jira.codehaus.org/browse/MNG-4324 > >> >> I can see how projectBaseDirectory name can be confusing, however, and >> happy to change the code if we find a better name. Does >> "sourceBaseDirectory" look better? Can you suggest a better name? >> >>> How about using the script-name as basename for the config. >>> mvn.config (or mvn.opts) for mvn.sh/mvn.bat >>> mvndebug.config (or mvndebug.opts) for mvndebug.sh/mvndebug.bat >>> In the end you want override the "global" (i.e environment variable >>> based) properties and with project specific values *for these scripts*, >>> right? >> >> $MAVEN_OPTS is supposed to override values provided in .mvn/java.config >> file. Likewise, explicitly specified mvn command line parameters are >> supposed to override values specified in .mvn/maven.config file. The >> idea is to allow users override project-provided configuration at build >> time. I believe I tested this, but if you see implementation behaves >> differently, please show me how to reproduce and I'll fix it. >> >> I do not believe configuration is specific to the script used to run >> maven. If project requires 1G of heap to build, this requirement is the >> same regardless if 'mvn' or 'mvnDebug' is used to start the build. >> >> -- >> Regards, >> Igor >> >> >>> thanks, >>> Robert >>> >>> Op Fri, 20 Feb 2015 14:15:15 +0100 schreef <[email protected]>: >>> >>>> Repository: maven >>>> Updated Branches: >>>> refs/heads/master ee7dbab69 -> 8ed9a1caa >>>> >>>> >>>> MNG-5767 .mvn/ for project specific jvm options and maven parameters >>>> >>>> Signed-off-by: Igor Fedorenko <[email protected]> >>>> >>>> >>>> Project: http://git-wip-us.apache.org/repos/asf/maven/repo >>>> Commit: http://git-wip-us.apache.org/repos/asf/maven/commit/8ed9a1ca >>>> Tree: http://git-wip-us.apache.org/repos/asf/maven/tree/8ed9a1ca >>>> Diff: http://git-wip-us.apache.org/repos/asf/maven/diff/8ed9a1ca >>>> >>>> Branch: refs/heads/master >>>> Commit: 8ed9a1caa8890773b45c6c408a4e40acf4f4b0fd >>>> Parents: ee7dbab >>>> Author: Igor Fedorenko <[email protected]> >>>> Authored: Mon Jan 26 14:22:05 2015 -0500 >>>> Committer: Igor Fedorenko <[email protected]> >>>> Committed: Fri Feb 20 08:14:08 2015 -0500 >>>> >>>> ---------------------------------------------------------------------- >>>> apache-maven/src/bin/mvn | 29 +++++++++- >>>> .../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 + >>>> 7 files changed, 166 insertions(+), 5 deletions(-) >>>> ---------------------------------------------------------------------- >>>> >>>> >>>> http://git-wip-us.apache.org/repos/asf/maven/blob/8ed9a1ca/apache-maven/src/bin/mvn >>>> >>>> ---------------------------------------------------------------------- >>>> diff --git a/apache-maven/src/bin/mvn b/apache-maven/src/bin/mvn >>>> index 1ed3024..26feda4 100755 >>>> --- a/apache-maven/src/bin/mvn >>>> +++ b/apache-maven/src/bin/mvn >>>> @@ -189,14 +189,39 @@ if $cygwin; then >>>> CLASSPATH=`cygpath --path --windows "$CLASSPATH"` >>>> fi >>>> +# 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 >>>> +} >>>> + >>>> +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/8ed9a1ca/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/8ed9a1ca/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 2b2a1d8..55d7ff2 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 >>>> >>>> @@ -415,4 +415,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/8ed9a1ca/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 35ccbd2..238be22 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; >>>> @@ -92,6 +94,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 >>>> @@ -106,6 +110,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" ); >>>> @@ -257,13 +263,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. >>>> @@ -276,7 +296,7 @@ public class MavenCli >>>> } >>>> } >>>> - private void cli( CliRequest cliRequest ) >>>> + void cli( CliRequest cliRequest ) >>>> throws Exception >>>> { >>>> // >>>> @@ -287,9 +307,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 ) >>>> { >>>> @@ -1074,6 +1123,7 @@ public class MavenCli >>>> .setUpdateSnapshots( updateSnapshots ) // default: false >>>> .setNoSnapshotUpdates( noSnapshotUpdates ) // default: false >>>> .setGlobalChecksumPolicy( globalChecksumPolicy ) // >>>> default: warn >>>> + .setProjectBaseDirectory( cliRequest.projectBaseDirectory ) >>>> ; >>>> if ( alternatePomFile != null ) >>>> @@ -1322,6 +1372,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/8ed9a1ca/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/8ed9a1ca/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/8ed9a1ca/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 >>> >>> --------------------------------------------------------------------- >>> To unsubscribe, e-mail: [email protected] >>> For additional commands, e-mail: [email protected] >>> >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: [email protected] >> For additional commands, e-mail: [email protected] > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [email protected] > For additional commands, e-mail: [email protected] > Thanks, Jason ---------------------------------------------------------- Jason van Zyl Founder, Takari and Apache Maven http://twitter.com/jvanzyl http://twitter.com/takari_io --------------------------------------------------------- To think is easy. To act is hard. But the hardest thing in the world is to act in accordance with your thinking. -- Johann von Goethe --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
