it is currently not merged to master, just in a MNG-5878 branch for review: for such a code change, I chose Review Then Commit process (instead of our classical Commit Then Review)
But I'm happy that you are interested For years, I heard many people (I can name a few I know personnally :) ) who called that convention "undocumented rigidity" from Maven, without really knowing about why this convention was the only solution before someone imagine a meaningfull configuration: then there was no proposal associated until MNG-5878 Now it's time to see if my (implemented) proposal is ok both from usability point of view and from code point of view Regards, Hervé Le mercredi 26 août 2015 17:55:48 Dan Tran a écrit : > Very excited to see how I can use this property. Good stuff > > Thanks > > -Dan > > On Wed, Aug 26, 2015 at 1:50 PM, Hervé BOUTEMY <[email protected]> > > wrote: > > I think I have found a way to support module directory in SCM & site that > > is > > not artifactId > > AFAIK, it's a long awaited feature that was until now feared to wreck > > havock > > > > please review and tell what you think about it > > > > Regards, > > > > Hervé > > > > Le mercredi 26 août 2015 20:26:37 [email protected] a écrit : > > > Repository: maven > > > > > > Updated Branches: > > > refs/heads/MNG-5878 [created] 812e1e9d5 > > > > > > MNG-5878 added project.directory property to configure module directory > > > when not equals to artifactId > > > > > > Project: http://git-wip-us.apache.org/repos/asf/maven/repo > > > Commit: http://git-wip-us.apache.org/repos/asf/maven/commit/812e1e9d > > > Tree: http://git-wip-us.apache.org/repos/asf/maven/tree/812e1e9d > > > Diff: http://git-wip-us.apache.org/repos/asf/maven/diff/812e1e9d > > > > > > Branch: refs/heads/MNG-5878 > > > Commit: 812e1e9d5b7d15a3b206371fc18110193f83cc1f > > > Parents: 6b6e9bf > > > Author: Hervé Boutemy <[email protected]> > > > Authored: Wed Aug 26 22:26:17 2015 +0200 > > > Committer: Hervé Boutemy <[email protected]> > > > Committed: Wed Aug 26 22:26:17 2015 +0200 > > > > > > ---------------------------------------------------------------------- > > > > > > .../DefaultInheritanceAssembler.java | 60 > > > > ++++++++++++++++---- > > > > > maven-model-builder/src/site/apt/index.apt | 2 +- > > > .../DefaultInheritanceAssemblerTest.java | 27 ++++++++- > > > .../module-path-not-artifactId-child.xml | 43 ++++++++++++++ > > > .../module-path-not-artifactId-expected.xml | 44 ++++++++++++++ > > > .../module-path-not-artifactId-parent.xml | 37 ++++++++++++ > > > 6 files changed, 199 insertions(+), 14 deletions(-) > > > > > > ---------------------------------------------------------------------- > > > > http://git-wip-us.apache.org/repos/asf/maven/blob/812e1e9d/maven-model-bui > > ld > > > > er/src/main/java/org/apache/maven/model/inheritance/DefaultInheritanceAsse > > mb> > > > ler.java > > > ---------------------------------------------------------------------- > > > > diff > > > > > --git > > > > a/maven-model-builder/src/main/java/org/apache/maven/model/inheritance/Def > > a > > > > > ultInheritanceAssembler.java > > > > b/maven-model-builder/src/main/java/org/apache/maven/model/inheritance/Def > > a > > > > > ultInheritanceAssembler.java index 48fdad5..7c2a3b4 100644 > > > --- > > > > a/maven-model-builder/src/main/java/org/apache/maven/model/inheritance/Def > > a > > > > > ultInheritanceAssembler.java +++ > > > > b/maven-model-builder/src/main/java/org/apache/maven/model/inheritance/Def > > a > > > > > ultInheritanceAssembler.java @@ -19,14 +19,16 @@ package > > > org.apache.maven.model.inheritance; > > > > > > * under the License. > > > */ > > > > > > -import java.io.File; > > > > > > import java.util.ArrayList; > > > import java.util.HashMap; > > > import java.util.LinkedHashMap; > > > import java.util.List; > > > import java.util.Map; > > > > > > +import java.util.Properties; > > > > > > +import org.apache.maven.model.InputLocation; > > > > > > import org.apache.maven.model.Model; > > > > > > +import org.apache.maven.model.ModelBase; > > > > > > import org.apache.maven.model.Plugin; > > > import org.apache.maven.model.PluginContainer; > > > import org.apache.maven.model.ReportPlugin; > > > > > > @@ -48,12 +50,18 @@ public class DefaultInheritanceAssembler > > > > > > private InheritanceModelMerger merger = new > > > > InheritanceModelMerger(); > > > > > + private final static String CHILD_DIRECTORY = "child-directory"; > > > + > > > + private final static String CHILD_DIRECTORY_PROPERTY = > > > "project.directory"; + > > > > > > @Override > > > public void assembleModelInheritance( Model child, Model parent, > > > > > > ModelBuildingRequest request, ModelProblemCollector problems ) { > > > > > > Map<Object, Object> hints = new HashMap<>(); > > > > > > - hints.put( MavenModelMerger.CHILD_PATH_ADJUSTMENT, > > > getChildPathAdjustment( child, parent ) ); + String childPath = > > > child.getProperties().getProperty( CHILD_DIRECTORY_PROPERTY, > > > child.getArtifactId() ); + hints.put( CHILD_DIRECTORY, childPath > > > > ); > > > > > + hints.put( MavenModelMerger.CHILD_PATH_ADJUSTMENT, > > > getChildPathAdjustment( child, parent, childPath ) ); merger.merge( > > > > child, > > > > > parent, false, hints ); > > > > > > } > > > > > > @@ -75,7 +83,7 @@ public class DefaultInheritanceAssembler > > > > > > * @param parent The parent model, may be <code>null</code>. > > > * @return The path adjustment, can be empty but never > > > > > > <code>null</code>. */ > > > - private String getChildPathAdjustment( Model child, Model parent ) > > > + private String getChildPathAdjustment( Model child, Model parent, > > > String childDirectory ) { > > > > > > String adjustment = ""; > > > > > > @@ -90,10 +98,9 @@ public class DefaultInheritanceAssembler > > > > > > * repository. In other words, modules where artifactId != > > > > > > moduleDirName will see different effective URLs * depending on how the > > > model was constructed (from filesystem or from repository). */ > > > - File childDirectory = child.getProjectDirectory(); > > > - if ( childDirectory != null ) > > > + if ( child.getProjectDirectory() != null ) > > > > > > { > > > > > > - childName = childDirectory.getName(); > > > + childName = child.getProjectDirectory().getName(); > > > > > > } > > > > > > for ( String module : parent.getModules() ) > > > > > > @@ -115,7 +122,7 @@ public class DefaultInheritanceAssembler > > > > > > moduleName = moduleName.substring( lastSlash + 1 ); > > > > > > - if ( moduleName.equals( childName ) && lastSlash >= 0 ) > > > + if ( ( moduleName.equals( childName ) || ( > > > moduleName.equals( childDirectory ) ) ) && lastSlash >= 0 ) { > > > > > > adjustment = module.substring( 0, lastSlash ); > > > break; > > > > > > @@ -133,13 +140,13 @@ public class DefaultInheritanceAssembler > > > > > > @Override > > > protected String extrapolateChildUrl( String parentUrl, > > > > Map<Object, > > > > > Object> context ) { > > > - Object artifactId = context.get( ARTIFACT_ID ); > > > + Object childDirectory = context.get( CHILD_DIRECTORY ); > > > > > > Object childPathAdjustment = context.get( > > > > CHILD_PATH_ADJUSTMENT > > > > > ); > > > > > > - if ( artifactId != null && childPathAdjustment != null ) > > > + if ( childDirectory != null && childPathAdjustment != null > > > ) > > > > > > { > > > > > > - // append childPathAdjustment and artifactId to parent > > > > url > > > > > - return appendPath( parentUrl, artifactId.toString(), > > > childPathAdjustment.toString() ); + // append > > > childPathAdjustment and childDirectory to parent url + > > > return appendPath( parentUrl, childDirectory.toString(), > > > childPathAdjustment.toString() ); } > > > > > > else > > > { > > > > > > @@ -185,6 +192,37 @@ public class DefaultInheritanceAssembler > > > > > > } > > > > > > @Override > > > > > > + protected void mergeModelBase_Properties( ModelBase target, > > > ModelBase source, boolean sourceDominant, + > > > > > > Map<Object, Object> context ) + { > > > > > > + Properties merged = new Properties(); > > > + if ( sourceDominant ) > > > + { > > > + merged.putAll( target.getProperties() ); > > > + putAll( merged, source.getProperties(), > > > CHILD_DIRECTORY_PROPERTY ); + } > > > + else > > > + { > > > + merged.putAll( source.getProperties() ); > > > + putAll( merged, target.getProperties(), > > > CHILD_DIRECTORY_PROPERTY ); + } > > > + target.setProperties( merged ); > > > + target.setLocation( "properties", InputLocation.merge( > > > target.getLocation( "properties" ), + > > > > > > source.getLocation( "properties" ), > > > > > > sourceDominant ) ); + } > > > + > > > + private void putAll( Map<Object, Object> s, Map<Object, Object> > > > > t, > > > > > Object excludeKey ) + { > > > + for ( Map.Entry<Object, Object> e : t.entrySet() ) > > > + { > > > + if ( !e.getKey().equals( excludeKey ) ) > > > + { > > > + s.put( e.getKey(), e.getValue() ); > > > + } > > > + } > > > + } > > > + > > > + @Override > > > > > > protected void mergePluginContainer_Plugins( PluginContainer > > > > > > target, PluginContainer source, boolean sourceDominant, Map<Object, > > > > Object> > > > > > context ) { > > > > http://git-wip-us.apache.org/repos/asf/maven/blob/812e1e9d/maven-model-bui > > ld> > > > er/src/site/apt/index.apt > > > ---------------------------------------------------------------------- > > > > diff > > > > > --git a/maven-model-builder/src/site/apt/index.apt > > > b/maven-model-builder/src/site/apt/index.apt index 9a645f4..764f8c6 > > > > 100644 > > > > > --- a/maven-model-builder/src/site/apt/index.apt > > > +++ b/maven-model-builder/src/site/apt/index.apt > > > @@ -62,7 +62,7 @@ Maven Model Builder > > > > ({{{./xref/org/apache/maven/model/inheritance/DefaultInheritanceAssembler. > > h > > > > > tml}source}}). Notice that <<<project.url>>>, > > > > <<<project.scm.connection>>>, > > > > > <<<project.scm.developerConnection>>>, <<<project.scm.url>>> and > > > > > <<<project.distributionManagement.site.url>>> have a special treatment: > > if > > > > > not overridden in child, the default value is parent's one - with > > > child > > > artifact id appended > > > + with child artifact id appended, or <<<project.directory>>> property > > > value if directory is not equals to artifact id > > > > > > ** model interpolation (see below) > > > > http://git-wip-us.apache.org/repos/asf/maven/blob/812e1e9d/maven-model-bui > > ld > > > > er/src/test/java/org/apache/maven/model/inheritance/DefaultInheritanceAsse > > mb> > > > lerTest.java > > > ---------------------------------------------------------------------- > > > > diff > > > > > --git > > > > a/maven-model-builder/src/test/java/org/apache/maven/model/inheritance/Def > > a > > > > > ultInheritanceAssemblerTest.java > > > > b/maven-model-builder/src/test/java/org/apache/maven/model/inheritance/Def > > a > > > > > ultInheritanceAssemblerTest.java index f9e95ec..e3a2d50 100644 > > > --- > > > > a/maven-model-builder/src/test/java/org/apache/maven/model/inheritance/Def > > a > > > > > ultInheritanceAssemblerTest.java +++ > > > > b/maven-model-builder/src/test/java/org/apache/maven/model/inheritance/Def > > a > > > > > ultInheritanceAssemblerTest.java @@ -88,12 +88,35 @@ public class > > > DefaultInheritanceAssemblerTest > > > > > > try ( Reader control = new InputStreamReader( new > > > > FileInputStream( > > > > > expected ), "UTF-8" ); Reader test = new InputStreamReader( new > > > FileInputStream( actual ), "UTF-8" ) ) { > > > - > > > > > > XMLUnit.setIgnoreComments( true ); > > > XMLUnit.setIgnoreWhitespace( true ); > > > XMLAssert.assertXMLEqual( control, test ); > > > > > > } > > > > > > - > > > > > > } > > > > > > + public void testModulePathNotArtifactId() > > > + throws Exception > > > + { > > > + Model parent = getModel( "module-path-not-artifactId-parent" ); > > > + > > > + Model child = getModel( "module-path-not-artifactId-child" ); > > > + > > > + SimpleProblemCollector problems = new SimpleProblemCollector(); > > > + > > > + assembler.assembleModelInheritance( child, parent, null, > > > > problems > > > > > ); + > > > + File actual = getTestFile( > > > > "target/test-classes/poms/inheritance/module-path-not-artifactId-actual.xm > > l > > > > > " ); + > > > + writer.write( actual, null, child ); > > > + > > > + // check with getPom( "module-path-not-artifactId-effective" ) > > > + File expected = getPom( "module-path-not-artifactId-expected" > > > ); > > > + try ( Reader control = new InputStreamReader( new > > > > FileInputStream( > > > > > expected ), "UTF-8" ); + Reader test = new > > > > InputStreamReader( > > > > > new FileInputStream( actual ), "UTF-8" ) ) + { > > > + XMLUnit.setIgnoreComments( true ); > > > + XMLUnit.setIgnoreWhitespace( true ); > > > + XMLAssert.assertXMLEqual( control, test ); > > > + } > > > + } > > > > > > } > > > > http://git-wip-us.apache.org/repos/asf/maven/blob/812e1e9d/maven-model-bui > > ld > > > > er/src/test/resources/poms/inheritance/module-path-not-artifactId-child.xm > > l > > > > > ---------------------------------------------------------------------- > > > > diff > > > > > --git > > > > a/maven-model-builder/src/test/resources/poms/inheritance/module-path-not- > > a > > > > > rtifactId-child.xml > > > > b/maven-model-builder/src/test/resources/poms/inheritance/module-path-not- > > a > > > > > rtifactId-child.xml new file mode 100644 > > > index 0000000..7031f44 > > > --- /dev/null > > > +++ > > > > b/maven-model-builder/src/test/resources/poms/inheritance/module-path-not- > > a > > > > > rtifactId-child.xml @@ -0,0 +1,43 @@ > > > +<?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> > > > + > > > + <parent> > > > + <groupId>inheritance</groupId> > > > + <artifactId>parent</artifactId> > > > + <version>11-SNAPSHOT</version> > > > + </parent> > > > + > > > + <artifactId>child-artifact-id</artifactId> > > > + <name>Model inheritance test parent: module directory != > > > artifactId</name> + <description> > > > + artifactId == "child-artifact-id" > > > + but expect path on SCM and site == "child" > > > + feature: support "project.directory" property, ressembling future > > > > model > > > > > addition of "directory" element along "artifactId" + </description> > > > + > > > + <properties> > > > + <project.directory>child</project.directory> > > > + </properties> > > > +</project> > > > \ No newline at end of file > > > > http://git-wip-us.apache.org/repos/asf/maven/blob/812e1e9d/maven-model-bui > > ld > > > > er/src/test/resources/poms/inheritance/module-path-not-artifactId-expected > > .x> > > > ml > > > ---------------------------------------------------------------------- > > > diff --git > > > > a/maven-model-builder/src/test/resources/poms/inheritance/module-path-not- > > a > > > > > rtifactId-expected.xml > > > > b/maven-model-builder/src/test/resources/poms/inheritance/module-path-not- > > a > > > > > rtifactId-expected.xml new file mode 100644 > > > index 0000000..38d9406 > > > --- /dev/null > > > +++ > > > > b/maven-model-builder/src/test/resources/poms/inheritance/module-path-not- > > a > > > > > rtifactId-expected.xml @@ -0,0 +1,44 @@ > > > +<?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> > > > + > > > + <parent> > > > + <groupId>inheritance</groupId> > > > + <artifactId>parent</artifactId> > > > + <version>11-SNAPSHOT</version> > > > + </parent> > > > + > > > + <groupId>inheritance</groupId> > > > + <artifactId>child-artifact-id</artifactId> > > > + <version>11-SNAPSHOT</version> > > > + <name>Model inheritance test parent: module directory != > > > artifactId</name> + <description> > > > + artifactId == "child-artifact-id" > > > + but expect path on SCM and site == "child" > > > + feature: support "project.directory" property, ressembling future > > > > model > > > > > addition of "directory" element along "artifactId" + </description> > > > + > > > + <url>http://www.apache.org/child/</url> > > > + > > > +</project> > > > > http://git-wip-us.apache.org/repos/asf/maven/blob/812e1e9d/maven-model-bui > > ld > > > > er/src/test/resources/poms/inheritance/module-path-not-artifactId-parent.x > > ml> > > > ---------------------------------------------------------------------- > > > > diff > > > > > --git > > > > a/maven-model-builder/src/test/resources/poms/inheritance/module-path-not- > > a > > > > > rtifactId-parent.xml > > > > b/maven-model-builder/src/test/resources/poms/inheritance/module-path-not- > > a > > > > > rtifactId-parent.xml new file mode 100644 > > > index 0000000..d29d78c > > > --- /dev/null > > > +++ > > > > b/maven-model-builder/src/test/resources/poms/inheritance/module-path-not- > > a > > > > > rtifactId-parent.xml @@ -0,0 +1,37 @@ > > > +<?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>inheritance</groupId> > > > + <artifactId>parent</artifactId> > > > + <version>11-SNAPSHOT</version> > > > + > > > + <name>Model inheritance test parent: module path != artifactId</name> > > > + <url>http://www.apache.org/</url> > > > + > > > + <modules> > > > + <module>child</module> > > > + </modules> > > > + > > > +</project> > > > \ No newline at end of file > > > > --------------------------------------------------------------------- > > 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]
