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 2023/01/19 10:54:48 UTC

[maven-integration-testing] branch master updated: [MNG-7629] Change reactor reader to copy packaged artifacts and reuse them across builds if needed (#234)

This is an automated email from the ASF dual-hosted git repository.

gnodet pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven-integration-testing.git


The following commit(s) were added to refs/heads/master by this push:
     new d39b1967a [MNG-7629] Change reactor reader to copy packaged artifacts and reuse them across builds if needed (#234)
d39b1967a is described below

commit d39b1967ad36af08359cb9530d0b74314089a167
Author: Guillaume Nodet <gn...@apache.org>
AuthorDate: Thu Jan 19 11:54:42 2023 +0100

    [MNG-7629] Change reactor reader to copy packaged artifacts and reuse them across builds if needed (#234)
---
 ...avenITmng2720SiblingClasspathArtifactsTest.java |    1 +
 ...enITmng3043BestEffortReactorResolutionTest.java |   40 +-
 .../it/MavenITmng4660OutdatedPackagedArtifact.java |    5 +-
 ...eResolutionOfDependenciesDuringReactorTest.java |    1 +
 ...st.java => MavenITmng7629SubtreeBuildTest.java} |   44 +-
 .../org/apache/maven/it/TestSuiteOrdering.java     |    1 +
 .../src/test/resources-filtered/bootstrap.txt      |    1 +
 .../test/resources/mng-7629/.mvn/placeholder.txt   |    0
 .../src/test/resources/mng-7629/child-1/pom.xml    |   63 ++
 .../java/org/apache/maven/its/mng7629/Test.java    |   23 +
 .../mng-7629/child-1/src/main/mdo/settings.mdo     | 1083 ++++++++++++++++++++
 .../src/test/resources/mng-7629/child-2/pom.xml    |   71 ++
 core-it-suite/src/test/resources/mng-7629/pom.xml  |   34 +
 13 files changed, 1318 insertions(+), 49 deletions(-)

diff --git a/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng2720SiblingClasspathArtifactsTest.java b/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng2720SiblingClasspathArtifactsTest.java
index 3dca206f2..76c3d604d 100644
--- a/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng2720SiblingClasspathArtifactsTest.java
+++ b/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng2720SiblingClasspathArtifactsTest.java
@@ -57,6 +57,7 @@ public class MavenITmng2720SiblingClasspathArtifactsTest
 
         Verifier verifier = newVerifier( testDir.getAbsolutePath() );
         verifier.setAutoclean( false );
+        verifier.deleteDirectory( "target" );
         verifier.deleteDirectory( "child2/target" );
         verifier.deleteDirectory( "child3/target" );
         verifier.addCliArgument( "initialize" );
diff --git a/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng3043BestEffortReactorResolutionTest.java b/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng3043BestEffortReactorResolutionTest.java
index 27b2a3641..1985b8605 100644
--- a/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng3043BestEffortReactorResolutionTest.java
+++ b/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng3043BestEffortReactorResolutionTest.java
@@ -56,6 +56,7 @@ public class MavenITmng3043BestEffortReactorResolutionTest
 
         Verifier verifier = newVerifier( testDir.getAbsolutePath() );
         verifier.setAutoclean( false );
+        verifier.deleteDirectory( "target" );
         verifier.deleteDirectory( "consumer-a/target" );
         verifier.deleteDirectory( "consumer-b/target" );
         verifier.deleteDirectory( "consumer-c/target" );
@@ -113,6 +114,7 @@ public class MavenITmng3043BestEffortReactorResolutionTest
 
         Verifier verifier = newVerifier( testDir.getAbsolutePath() );
         verifier.setAutoclean( false );
+        verifier.deleteDirectory( "target" );
         verifier.deleteDirectory( "consumer-a/target" );
         verifier.deleteDirectory( "consumer-b/target" );
         verifier.deleteDirectory( "consumer-c/target" );
@@ -122,37 +124,39 @@ public class MavenITmng3043BestEffortReactorResolutionTest
         verifier.execute();
         verifier.verifyErrorFreeLog();
 
+        String prefix = matchesVersionRange("[4.0.0-alpha-4,)") ? "dependency-0.1-SNAPSHOT-" : "";
+
         List<String> classpath;
 
         classpath = verifier.loadLines( "consumer-a/target/compile.txt", "UTF-8" );
-        assertContains( classpath, new String[] { "tests.jar" } );
-        assertNotContains( classpath, new String[] { "client.jar" } );
+        assertContains( classpath, new String[] { prefix + "tests.jar" } );
+        assertNotContains( classpath, new String[] { prefix + "client.jar" } );
         classpath = verifier.loadLines( "consumer-a/target/runtime.txt", "UTF-8" );
-        assertContains( classpath, new String[] { "tests.jar" } );
-        assertNotContains( classpath, new String[] { "client.jar" } );
+        assertContains( classpath, new String[] { prefix + "tests.jar" } );
+        assertNotContains( classpath, new String[] { prefix + "client.jar" } );
         classpath = verifier.loadLines( "consumer-a/target/test.txt", "UTF-8" );
-        assertContains( classpath, new String[] { "tests.jar" } );
-        assertNotContains( classpath, new String[] { "client.jar" } );
+        assertContains( classpath, new String[] { prefix + "tests.jar" } );
+        assertNotContains( classpath, new String[] { prefix + "client.jar" } );
 
         classpath = verifier.loadLines( "consumer-b/target/compile.txt", "UTF-8" );
-        assertContains( classpath, new String[] { "client.jar" } );
-        assertNotContains( classpath, new String[] { "tests.jar" } );
+        assertContains( classpath, new String[] { prefix + "client.jar" } );
+        assertNotContains( classpath, new String[] { prefix + "tests.jar" } );
         classpath = verifier.loadLines( "consumer-b/target/runtime.txt", "UTF-8" );
-        assertContains( classpath, new String[] { "client.jar" } );
-        assertNotContains( classpath, new String[] { "tests.jar" } );
+        assertContains( classpath, new String[] { prefix + "client.jar" } );
+        assertNotContains( classpath, new String[] { prefix + "tests.jar" } );
         classpath = verifier.loadLines( "consumer-b/target/test.txt", "UTF-8" );
-        assertContains( classpath, new String[] { "client.jar" } );
-        assertNotContains( classpath, new String[] { "tests.jar" } );
+        assertContains( classpath, new String[] { prefix + "client.jar" } );
+        assertNotContains( classpath, new String[] { prefix + "tests.jar" } );
 
         classpath = verifier.loadLines( "consumer-c/target/compile.txt", "UTF-8" );
-        assertContains( classpath, new String[] { "client.jar" } );
-        assertContains( classpath, new String[] { "tests.jar" } );
+        assertContains( classpath, new String[] { prefix + "client.jar" } );
+        assertContains( classpath, new String[] { prefix + "tests.jar" } );
         classpath = verifier.loadLines( "consumer-c/target/runtime.txt", "UTF-8" );
-        assertContains( classpath, new String[] { "client.jar" } );
-        assertContains( classpath, new String[] { "tests.jar" } );
+        assertContains( classpath, new String[] { prefix + "client.jar" } );
+        assertContains( classpath, new String[] { prefix + "tests.jar" } );
         classpath = verifier.loadLines( "consumer-c/target/test.txt", "UTF-8" );
-        assertContains( classpath, new String[] { "client.jar" } );
-        assertContains( classpath, new String[] { "tests.jar" } );
+        assertContains( classpath, new String[] { prefix + "client.jar" } );
+        assertContains( classpath, new String[] { prefix + "tests.jar" } );
     }
 
     private void assertContains( List<String> collection, String[] items )
diff --git a/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng4660OutdatedPackagedArtifact.java b/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng4660OutdatedPackagedArtifact.java
index cfc476738..aa9f5637e 100644
--- a/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng4660OutdatedPackagedArtifact.java
+++ b/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng4660OutdatedPackagedArtifact.java
@@ -119,10 +119,7 @@ public class MavenITmng4660OutdatedPackagedArtifact extends AbstractMavenIntegra
         {
             verifier3.verifyTextInLog( "File '"
                     + Paths.get( "module-a", "target", "classes", "example.properties" )
-                    + "' is more recent than the packaged artifact for 'module-a'; "
-                    + "using '"
-                    + Paths.get( "module-a", "target","classes" )
-                    + "' instead"
+                    + "' is more recent than the packaged artifact for 'module-a', please run a full `mvn package` build"
             );
         }
         catch ( VerificationException e )
diff --git a/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng4814ReResolutionOfDependenciesDuringReactorTest.java b/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng4814ReResolutionOfDependenciesDuringReactorTest.java
index c8d8e0707..8a92a4ec4 100644
--- a/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng4814ReResolutionOfDependenciesDuringReactorTest.java
+++ b/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng4814ReResolutionOfDependenciesDuringReactorTest.java
@@ -57,6 +57,7 @@ public class MavenITmng4814ReResolutionOfDependenciesDuringReactorTest
 
         Verifier verifier = newVerifier( testDir.getAbsolutePath() );
         verifier.setAutoclean( false );
+        verifier.deleteDirectory( "target" );
         verifier.deleteDirectory( "consumer/target" );
         verifier.deleteArtifacts( "org.apache.maven.its.mng4814" );
         verifier.addCliArgument( "-s" );
diff --git a/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng4814ReResolutionOfDependenciesDuringReactorTest.java b/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng7629SubtreeBuildTest.java
similarity index 51%
copy from core-it-suite/src/test/java/org/apache/maven/it/MavenITmng4814ReResolutionOfDependenciesDuringReactorTest.java
copy to core-it-suite/src/test/java/org/apache/maven/it/MavenITmng7629SubtreeBuildTest.java
index c8d8e0707..48b0c69aa 100644
--- a/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng4814ReResolutionOfDependenciesDuringReactorTest.java
+++ b/core-it-suite/src/test/java/org/apache/maven/it/MavenITmng7629SubtreeBuildTest.java
@@ -19,58 +19,48 @@ package org.apache.maven.it;
  * under the License.
  */
 
-import org.apache.maven.shared.verifier.util.ResourceExtractor;
 import org.apache.maven.shared.verifier.Verifier;
+import org.apache.maven.shared.verifier.util.ResourceExtractor;
+import org.junit.jupiter.api.Test;
 
 import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.junit.jupiter.api.Test;
 
 /**
- * This is a test set for <a href="https://issues.apache.org/jira/browse/MNG-4814">MNG-4814</a>.
+ * This is a test set for <a href="https://issues.apache.org/jira/browse/MNG-7629">MNG-7629</a>.
+ * It checks that building a subtree that consumes an attached artifact works
  *
- * @author Benjamin Bentmann
  */
-public class MavenITmng4814ReResolutionOfDependenciesDuringReactorTest
+class MavenITmng7629SubtreeBuildTest
     extends AbstractMavenIntegrationTestCase
 {
 
-    public MavenITmng4814ReResolutionOfDependenciesDuringReactorTest()
+    public MavenITmng7629SubtreeBuildTest()
     {
-        super( "[3.0,)" );
+        super( "[4.0.0-alpha-4,)" );
     }
 
     /**
-     * Verify that dependency resolution by an aggregator before the build has actually produced any artifacts
-     * doesn't prevent later resolution of project artifacts from the reactor if the aggregator originally resolved
-     * them from the remote repo.
+     * Verify that dependencies which are managed through imported dependency management work
      *
      * @throws Exception in case of failure
      */
     @Test
-    public void testit()
+    void testBuildSubtree()
         throws Exception
     {
-        File testDir = ResourceExtractor.simpleExtractResources( getClass(), "/mng-4814" );
+        File testDir = ResourceExtractor.simpleExtractResources( getClass(), "/mng-7629" );
 
         Verifier verifier = newVerifier( testDir.getAbsolutePath() );
-        verifier.setAutoclean( false );
-        verifier.deleteDirectory( "consumer/target" );
-        verifier.deleteArtifacts( "org.apache.maven.its.mng4814" );
-        verifier.addCliArgument( "-s" );
-        verifier.addCliArgument( "settings.xml" );
-        verifier.filterFile( "settings-template.xml", "settings.xml", "UTF-8" );
-        verifier.addCliArguments( "validate",
-            "org.apache.maven.its.plugins:maven-it-plugin-dependency-resolution:2.1-SNAPSHOT:aggregate-test" );
+        verifier.setAutoclean( true );
+        verifier.addCliArgument( "verify" );
         verifier.execute();
         verifier.verifyErrorFreeLog();
 
-        List<String> compile = verifier.loadLines( "consumer/target/compile.txt", "UTF-8" );
-
-        assertFalse( compile.toString(), compile.contains( "0.1-SNAPSHOT/producer-0.1-SNAPSHOT.jar" ) );
-        assertTrue( compile.toString(), compile.contains( "producer/pom.xml" ) );
+        verifier = newVerifier( testDir.getAbsolutePath() );
+        verifier.setAutoclean( true );
+        verifier.addCliArguments( "-f", "child-2", "verify" );
+        verifier.execute();
+        verifier.verifyErrorFreeLog();
     }
 
 }
diff --git a/core-it-suite/src/test/java/org/apache/maven/it/TestSuiteOrdering.java b/core-it-suite/src/test/java/org/apache/maven/it/TestSuiteOrdering.java
index e5e8e1a53..1e5ab87e3 100644
--- a/core-it-suite/src/test/java/org/apache/maven/it/TestSuiteOrdering.java
+++ b/core-it-suite/src/test/java/org/apache/maven/it/TestSuiteOrdering.java
@@ -105,6 +105,7 @@ public class TestSuiteOrdering implements ClassOrderer
          * the tests are to finishing. Newer tests are also more likely to fail, so this is
          * a fail fast technique as well.
          */
+        suite.addTestSuite( MavenITmng7629SubtreeBuildTest.class );
         suite.addTestSuite( MavenITmng7606DependencyImportScopeTest.class );
         suite.addTestSuite( MavenITmng6609ProfileActivationForPackagingTest.class );
         suite.addTestSuite( MavenITmng7566JavaPrerequisiteTest.class );
diff --git a/core-it-suite/src/test/resources-filtered/bootstrap.txt b/core-it-suite/src/test/resources-filtered/bootstrap.txt
index d9ccd06b7..148c05a81 100644
--- a/core-it-suite/src/test/resources-filtered/bootstrap.txt
+++ b/core-it-suite/src/test/resources-filtered/bootstrap.txt
@@ -132,6 +132,7 @@ org.apache.maven:maven-script-ant:2.1.0
 org.apache.maven:maven-settings-builder:3.1.1
 org.apache.maven:maven-settings:3.1.1
 org.codehaus.gmavenplus:gmavenplus-plugin:1.11.0
+org.codehaus.mojo:build-helper-maven-plugin:3.2.0
 org.codehaus.mojo:flatten-maven-plugin:1.0.0
 org.codehaus.plexus:plexus-classworlds:2.5.1
 org.codehaus.plexus:plexus-component-annotations:1.5.5
diff --git a/core-it-suite/src/test/resources/mng-7629/.mvn/placeholder.txt b/core-it-suite/src/test/resources/mng-7629/.mvn/placeholder.txt
new file mode 100644
index 000000000..e69de29bb
diff --git a/core-it-suite/src/test/resources/mng-7629/child-1/pom.xml b/core-it-suite/src/test/resources/mng-7629/child-1/pom.xml
new file mode 100644
index 000000000..8e1845845
--- /dev/null
+++ b/core-it-suite/src/test/resources/mng-7629/child-1/pom.xml
@@ -0,0 +1,63 @@
+<?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>org.apache.maven.its.mng7629</groupId>
+        <artifactId>test</artifactId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>child-1</artifactId>
+
+    <properties>
+        <maven.compiler.source>8</maven.compiler.source>
+        <maven.compiler.target>8</maven.compiler.target>
+    </properties>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>build-helper-maven-plugin</artifactId>
+                <version>3.2.0</version>
+                <executions>
+                    <execution>
+                        <id>attach-mdo</id>
+                        <goals>
+                            <goal>attach-artifact</goal>
+                        </goals>
+                        <configuration>
+                            <artifacts>
+                                <artifact>
+                                    <file>src/main/mdo/settings.mdo</file>
+                                    <type>mdo</type>
+                                </artifact>
+                            </artifacts>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/core-it-suite/src/test/resources/mng-7629/child-1/src/main/java/org/apache/maven/its/mng7629/Test.java b/core-it-suite/src/test/resources/mng-7629/child-1/src/main/java/org/apache/maven/its/mng7629/Test.java
new file mode 100644
index 000000000..9217ba515
--- /dev/null
+++ b/core-it-suite/src/test/resources/mng-7629/child-1/src/main/java/org/apache/maven/its/mng7629/Test.java
@@ -0,0 +1,23 @@
+/*
+ * 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.its.mng7629;
+
+class Test {
+
+}
diff --git a/core-it-suite/src/test/resources/mng-7629/child-1/src/main/mdo/settings.mdo b/core-it-suite/src/test/resources/mng-7629/child-1/src/main/mdo/settings.mdo
new file mode 100644
index 000000000..93fa6034a
--- /dev/null
+++ b/core-it-suite/src/test/resources/mng-7629/child-1/src/main/mdo/settings.mdo
@@ -0,0 +1,1083 @@
+<?xml version="1.0"?>
+
+<!--
+  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.
+-->
+
+<model xmlns="http://codehaus-plexus.github.io/MODELLO/1.4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://codehaus-plexus.github.io/MODELLO/1.4.0 http://codehaus-plexus.github.io/modello/xsd/modello-1.4.0.xsd"
+  xml.namespace="http://maven.apache.org/SETTINGS/${version}"
+  xml.schemaLocation="http://maven.apache.org/xsd/settings-${version}.xsd">
+  <id>settings</id>
+  <name>Settings</name>
+  <description>
+    <![CDATA[
+    <p>This is a reference for the user-specific configuration for Maven.</p>
+    <p>Includes things that should not be distributed with the pom.xml file, such as developer identity, along with
+    local settings, like proxy information.</p>
+    <p>The default location for the settings file is <i>~/.m2/settings.xml</i></p>
+    ]]>
+  </description>
+  <defaults>
+    <default>
+      <key>package</key>
+      <value>org.apache.maven.settings</value>
+    </default>
+  </defaults>
+  <classes>
+    <class java.clone="deep">
+      <name>TrackableBase</name>
+      <version>1.0.0+</version>
+      <description>
+        common base class that contains code to track the source for
+        this instance (USER|GLOBAL)
+      </description>
+      <codeSegments>
+        <codeSegment>
+          <version>1.0.0+</version>
+          <code>
+            <![CDATA[
+    public static final String USER_LEVEL = "user-level";
+    public static final String GLOBAL_LEVEL = "global-level";
+
+    private String sourceLevel = USER_LEVEL;
+    private boolean sourceLevelSet = false;
+
+    public void setSourceLevel( String sourceLevel )
+    {
+        if ( sourceLevelSet )
+        {
+            throw new IllegalStateException( "Cannot reset sourceLevel attribute; it is already set to: " + sourceLevel );
+        }
+        else if ( !( USER_LEVEL.equals( sourceLevel ) || GLOBAL_LEVEL.equals( sourceLevel ) ) )
+        {
+            throw new IllegalArgumentException( "sourceLevel must be one of: {" + USER_LEVEL + "," + GLOBAL_LEVEL + "}" );
+        }
+        else
+        {
+            this.sourceLevel = sourceLevel;
+            this.sourceLevelSet = true;
+        }
+    }
+
+    public String getSourceLevel()
+    {
+        return sourceLevel;
+    }
+            ]]>
+          </code>
+        </codeSegment>
+      </codeSegments>
+    </class>
+    <class>
+      <name>IdentifiableBase</name>
+      <superClass>TrackableBase</superClass>
+      <version>1.0.0+</version>
+      <description>
+        <![CDATA[
+        Base class for <code>Mirror</code>, <code>Profile</code>, <code>Proxy</code> and <code>Server</code>.
+        ]]></description>
+      <fields>
+        <field>
+          <name>id</name>
+          <version>1.0.0+</version>
+          <type>String</type>
+          <defaultValue>default</defaultValue>
+          <required>true</required>
+        </field>
+      </fields>
+    </class>
+    <class rootElement="true" xml.tagName="settings">
+      <name>Settings</name>
+      <version>1.0.0+</version>
+      <superClass>TrackableBase</superClass>
+      <description>
+        Root element of the user configuration file.
+      </description>
+      <fields>
+        <field>
+          <name>localRepository</name>
+          <version>1.0.0+</version>
+          <required>true</required>
+          <description>
+            <![CDATA[
+            The local repository.<br><b>Default value is:</b> <code>${user.home}/.m2/repository</code>
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>interactiveMode</name>
+          <version>1.0.0+</version>
+          <description>
+            <![CDATA[
+            Whether Maven should attempt to interact with the user for input.
+            ]]>
+          </description>
+          <type>boolean</type>
+          <defaultValue>true</defaultValue>
+        </field>
+        <field>
+          <name>usePluginRegistry</name>
+          <version>1.0.0+</version>
+          <description>
+            <![CDATA[
+            Whether Maven should use the plugin-registry.xml file to manage plugin versions.
+            ]]>
+          </description>
+          <type>boolean</type>
+          <defaultValue>false</defaultValue>
+        </field>
+        <!-- [JC] Not ready to use yet, so I'm making if unavailable for now. -->
+        <!-- field>
+          <name>passwordStore</name>
+          <version>1.0.0+</version>
+          <required>false</required>
+          <description><![CDATA[The keystore used to store passwords.]]></description>
+          <type>String</type>
+          </field -->
+        <field>
+          <name>offline</name>
+          <version>1.0.0+</version>
+          <required>false</required>
+          <description>
+            <![CDATA[
+            Indicate whether maven should operate in offline mode full-time.
+            ]]>
+          </description>
+          <type>boolean</type>
+          <defaultValue>false</defaultValue>
+        </field>
+        <!-- [JC] Not ready to use yet, so I'm making if unavailable for now. -->
+        <!-- field>
+          <name>jdks</name>
+          <version>1.0.0+</version>
+          <description><![CDATA[
+          Configuration for different java environment profiles. One good use
+          for this might be to configure both JDK 1.4 and JDK 1.5 to work with
+          maven. Profiles will allow switching of entire java environments
+          based on the profile id, either in the defaults section below, or on
+          the command line.
+          ]]></description>
+          <association>
+          <type>Jdk</type>
+          <multiplicity>*</multiplicity>
+          </association>
+          </field -->
+        <field xdoc.separator="blank">
+          <name>proxies</name>
+          <version>1.0.0+</version>
+          <description>
+            <![CDATA[
+            Configuration for different proxy profiles. Multiple proxy profiles
+            might come in handy for anyone working from a notebook or other
+            mobile platform, to enable easy switching of entire proxy
+            configurations by simply specifying the profile id, again either from
+            the command line or from the defaults section below.
+            ]]>
+          </description>
+          <association>
+            <type>Proxy</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+        <field xdoc.separator="blank">
+          <name>servers</name>
+          <version>1.0.0+</version>
+          <description>
+            <![CDATA[
+            Configuration of server-specific settings, mainly authentication
+            method. This allows configuration of authentication on a per-server
+            basis.
+            ]]>
+          </description>
+          <association>
+            <type>Server</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+        <field xdoc.separator="blank">
+          <name>mirrors</name>
+          <version>1.0.0+</version>
+          <description>
+            Configuration of download mirrors for repositories.
+          </description>
+          <association>
+            <type>Mirror</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+        <field xdoc.separator="blank">
+          <name>profiles</name>
+          <version>1.0.0+</version>
+          <description>
+            <![CDATA[
+            Configuration of build profiles for adjusting the build
+            according to environmental parameters.
+            ]]>
+          </description>
+          <association>
+            <type>Profile</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+        <field xdoc.separator="blank">
+          <name>activeProfiles</name>
+          <version>1.0.0+</version>
+          <description>
+            <![CDATA[
+            List of manually-activated build profiles, specified in the order in which
+            they should be applied.
+            ]]>
+          </description>
+          <association>
+            <type>String</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+        <field>
+          <name>pluginGroups</name>
+          <version>1.0.0+</version>
+          <description>
+            List of groupIds to search for a plugin when that plugin
+            groupId is not explicitly provided.
+          </description>
+          <association>
+            <type>String</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+      </fields>
+      <codeSegments>
+        <codeSegment>
+          <version>1.0.0+</version>
+          <code>
+            <![CDATA[
+    public Boolean getInteractiveMode()
+    {
+        return Boolean.valueOf( isInteractiveMode() );
+    }
+
+    private Proxy activeProxy;
+
+    /**
+     * Reset the <code>activeProxy</code> field to <code>null</code>
+     */
+    public void flushActiveProxy()
+    {
+        this.activeProxy = null;
+    }
+
+    /**
+     * @return the first active proxy
+     */
+    public synchronized Proxy getActiveProxy()
+    {
+        if ( activeProxy == null )
+        {
+            java.util.List<Proxy> proxies = getProxies();
+            if ( proxies != null && !proxies.isEmpty() )
+            {
+                for ( Proxy proxy : proxies )
+                {
+                    if ( proxy.isActive() )
+                    {
+                        activeProxy = proxy;
+                        break;
+                    }
+                }
+            }
+        }
+
+        return activeProxy;
+    }
+
+    public Server getServer( String serverId )
+    {
+        Server match = null;
+
+        java.util.List<Server> servers = getServers();
+        if ( servers != null && serverId != null )
+        {
+            for ( Server server : servers )
+            {
+                if ( serverId.equals( server.getId() ) )
+                {
+                    match = server;
+                    break;
+                }
+            }
+        }
+
+        return match;
+    }
+
+    @Deprecated
+    public Mirror getMirrorOf( String repositoryId )
+    {
+        Mirror match = null;
+
+        java.util.List<Mirror> mirrors = getMirrors();
+        if ( mirrors != null && repositoryId != null )
+        {
+            for ( Mirror mirror : mirrors )
+            {
+                if ( repositoryId.equals( mirror.getMirrorOf() ) )
+                {
+                    match = mirror;
+                    break;
+                }
+            }
+        }
+
+        return match;
+    }
+
+    private java.util.Map<String, Profile> profileMap;
+
+    /**
+     * Reset the <code>profileMap</code> field to <code>null</code>
+     */
+    public void flushProfileMap()
+    {
+        this.profileMap = null;
+    }
+
+    /**
+     * @return a Map of profiles field with <code>Profile#getId()</code> as key
+     * @see Profile#getId()
+     */
+    public java.util.Map<String, Profile> getProfilesAsMap()
+    {
+        if ( profileMap == null )
+        {
+            profileMap = new java.util.LinkedHashMap<String, Profile>();
+
+            if ( getProfiles() != null )
+            {
+                for ( Profile profile : getProfiles() )
+                {
+                    profileMap.put( profile.getId(), profile );
+                }
+            }
+        }
+
+        return profileMap;
+    }
+            ]]>
+          </code>
+        </codeSegment>
+      </codeSegments>
+    </class>
+    <!-- @todo: is any of this too CVS specific? Investigate other SCMs -->
+    <!-- [JC] Commenting out until we're ready to use it... -->
+    <!-- class>
+      <name>Jdk</name>
+      <version>1.0.0+</version>
+      <superClass>TrackableBase</superClass>
+      <description><![CDATA[Describes one Java environment]]></description>
+      <fields>
+      <field>
+      <name>active</name>
+      <version>1.0.0+</version>
+      <required>false</required>
+      <defaultValue>false</defaultValue>
+      <description><![CDATA[Whether this JDK is the active one.]]></description>
+      <type>boolean</type>
+      </field>
+      <field>
+      <name>version</name>
+      <version>1.0.0+</version>
+      <required>true</required>
+      <description><![CDATA[The JDK major version (eg. '1.4').]]></description>
+      <type>String</type>
+      </field>
+      <field>
+      <name>javaHome</name>
+      <version>1.0.0+</version>
+      <required>true</required>
+      <description><![CDATA[The JDK home.]]></description>
+      <type>String</type>
+      </field>
+      </fields>
+      </class -->
+    <class>
+      <name>Proxy</name>
+      <version>1.0.0+</version>
+      <superClass>IdentifiableBase</superClass>
+      <description>
+        <![CDATA[
+        The <code>&lt;proxy&gt;</code> element contains informations required to a proxy settings.
+        ]]></description>
+      <fields>
+        <field>
+          <name>active</name>
+          <version>1.0.0+</version>
+          <required>false</required>
+          <defaultValue>true</defaultValue>
+          <description>
+            <![CDATA[
+            Whether this proxy configuration is the active one.
+            ]]>
+          </description>
+          <type>boolean</type>
+        </field>
+        <field>
+          <name>protocol</name>
+          <version>1.0.0+</version>
+          <description>
+            <![CDATA[
+            The proxy protocol.
+            ]]>
+          </description>
+          <type>String</type>
+          <defaultValue>http</defaultValue>
+        </field>
+        <field>
+          <name>username</name>
+          <version>1.0.0+</version>
+          <description>
+            <![CDATA[
+            The proxy user.
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>password</name>
+          <version>1.0.0+</version>
+          <description>
+            <![CDATA[
+            The proxy password.
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>port</name>
+          <version>1.0.0+</version>
+          <description>
+            <![CDATA[
+            The proxy port.
+            ]]>
+          </description>
+          <type>int</type>
+          <defaultValue>8080</defaultValue>
+        </field>
+        <field>
+          <name>host</name>
+          <version>1.0.0+</version>
+          <description>
+            <![CDATA[
+            The proxy host.
+            ]]>
+          </description>
+          <type>String</type>
+          <required>true</required>
+        </field>
+        <field>
+          <name>nonProxyHosts</name>
+          <version>1.0.0+</version>
+          <description>
+            <![CDATA[
+            The list of non-proxied hosts (delimited by |).
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+      </fields>
+    </class>
+    <class>
+      <name>Server</name>
+      <version>1.0.0+</version>
+      <superClass>IdentifiableBase</superClass>
+      <description>
+        <![CDATA[
+        The <code>&lt;server&gt;</code> element contains informations required to a server settings.
+        ]]></description>
+      <fields>
+        <field>
+          <name>username</name>
+          <version>1.0.0+</version>
+          <description>
+            <![CDATA[
+            The username used to authenticate.
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>password</name>
+          <version>1.0.0+</version>
+          <description>
+            <![CDATA[
+            The password used in conjunction with the username to authenticate.
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>privateKey</name>
+          <version>1.0.0+</version>
+          <description>
+            <![CDATA[
+            The private key location used to authenticate.
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>passphrase</name>
+          <version>1.0.0+</version>
+          <description>
+            <![CDATA[
+            The passphrase used in conjunction with the privateKey to authenticate.
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>filePermissions</name>
+          <version>1.0.0+</version>
+          <description>
+            <![CDATA[
+            The permissions for files when they are created.
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>directoryPermissions</name>
+          <version>1.0.0+</version>
+          <description>
+            <![CDATA[
+            The permissions for directories when they are created.
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>configuration</name>
+          <type>DOM</type>
+          <description>
+            <![CDATA[
+            Extra configuration for the transport layer.
+            ]]>
+          </description>
+        </field>
+      </fields>
+    </class>
+    <class>
+      <name>Mirror</name>
+      <version>1.0.0+</version>
+      <superClass>IdentifiableBase</superClass>
+      <description>
+        A download mirror for a given repository.
+      </description>
+      <fields>
+        <field>
+          <name>mirrorOf</name>
+          <required>true</required>
+          <version>1.0.0+</version>
+          <type>String</type>
+          <description>
+            The server ID of the repository being mirrored, e.g.,
+            "central". This MUST NOT match the mirror id.
+          </description>
+        </field>
+        <field>
+          <name>name</name>
+          <required>false</required>
+          <version>1.0.0+</version>
+          <type>String</type>
+          <description>
+            The optional name that describes the mirror.
+          </description>
+        </field>
+        <field>
+          <name>url</name>
+          <required>true</required>
+          <version>1.0.0+</version>
+          <type>String</type>
+          <description>The URL of the mirror repository.</description>
+        </field>
+        <field>
+          <name>layout</name>
+          <version>1.1.0+</version>
+          <type>String</type>
+          <defaultValue>default</defaultValue>
+          <description>The layout of the mirror repository. Since Maven 3.</description>
+        </field>
+        <field>
+          <name>mirrorOfLayouts</name>
+          <version>1.1.0+</version>
+          <type>String</type>
+          <defaultValue>default,legacy</defaultValue>
+          <description>
+            The layouts of repositories being mirrored. This value can be used to restrict the usage
+            of the mirror to repositories with a matching layout (apart from a matching id). Since Maven 3.
+          </description>
+        </field>
+        <field>
+          <name>blocked</name>
+          <version>1.2.0+</version>
+          <type>boolean</type>
+          <defaultValue>false</defaultValue>
+          <description>
+            Whether this mirror should be blocked from any download request but fail the download process, explaining why.
+          </description>
+        </field>
+      </fields>
+      <codeSegments>
+        <codeSegment>
+          <version>1.0.0+</version>
+          <code>
+            <![CDATA[
+
+    public String toString()
+    {
+        StringBuilder sb = new StringBuilder( 128 );
+        sb.append( "Mirror[" );
+        sb.append( "id=" ).append( this.getId() );
+        sb.append( ",mirrorOf=" ).append( this.getMirrorOf() );
+        sb.append( ",url=" ).append( this.getUrl() );
+        sb.append( ",name=" ).append( this.getName() );
+        if ( isBlocked() )
+        {
+            sb.append( ",blocked" );
+        }
+        sb.append( "]" );
+        return sb.toString();
+    }
+            ]]>
+          </code>
+        </codeSegment>
+      </codeSegments>
+    </class>
+    <!-- Profile support -->
+    <class>
+      <name>Profile</name>
+      <version>1.0.0+</version>
+      <superClass>IdentifiableBase</superClass>
+      <description>
+        <![CDATA[
+        Modifications to the build process which is keyed on some
+        sort of environmental parameter.
+        ]]>
+      </description>
+      <fields>
+        <field>
+          <name>activation</name>
+          <version>1.0.0+</version>
+          <description>
+            <![CDATA[
+            The conditional logic which will automatically
+            trigger the inclusion of this profile.
+            ]]>
+          </description>
+          <association>
+            <type>Activation</type>
+          </association>
+        </field>
+        <field>
+          <name>properties</name>
+          <description>
+            <![CDATA[
+            Extended configuration specific to this profile goes here.
+            Contents take the form of
+            <code>&lt;property.name&gt;property.value&lt;/property.name&gt;</code>
+            ]]>
+          </description>
+          <type>Properties</type>
+          <association xml.mapStyle="inline">
+            <type>String</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+        <field xdoc.separator="blank">
+          <name>repositories</name>
+          <version>1.0.0+</version>
+          <description>
+            <![CDATA[
+            The lists of the remote repositories.
+            ]]>
+          </description>
+          <association>
+            <type>Repository</type>
+            <multiplicity>*</multiplicity>
+          </association>
+        </field>
+        <field>
+          <name>pluginRepositories</name>
+          <version>1.0.0+</version>
+          <description>
+            <![CDATA[
+            The lists of the remote repositories for discovering plugins.
+            ]]>
+          </description>
+          <association>
+            <type>Repository</type>
+            <multiplicity>*</multiplicity>
+          </association>
+          <comment>
+            <![CDATA[
+            This may be removed or relocated in the near
+            future. It is undecided whether plugins really need a remote
+            repository set of their own.
+            ]]>
+          </comment>
+        </field>
+      </fields>
+    </class>
+    <class java.clone="deep">
+      <name>Activation</name>
+      <version>1.0.0+</version>
+      <description>
+        <![CDATA[
+        The conditions within the build runtime environment which will trigger
+        the automatic inclusion of the parent build profile.
+        ]]>
+      </description>
+      <fields>
+        <field>
+          <name>activeByDefault</name>
+          <version>1.0.0+</version>
+          <type>boolean</type>
+          <description>
+            Flag specifying whether this profile is active as a default.
+          </description>
+        </field>
+        <field>
+          <name>jdk</name>
+          <version>1.0.0+</version>
+          <type>String</type>
+          <description>
+            <![CDATA[
+            Specifies that this profile will be activated when a matching JDK is detected.
+            ]]>
+          </description>
+        </field>
+        <field>
+          <name>os</name>
+          <version>1.0.0+</version>
+          <description>
+            <![CDATA[
+            Specifies that this profile will be activated when matching OS attributes are detected.
+            ]]>
+          </description>
+          <association>
+            <type>ActivationOS</type>
+          </association>
+        </field>
+        <field>
+          <name>property</name>
+          <version>1.0.0+</version>
+          <description>
+            <![CDATA[
+            Specifies that this profile will be activated when this property is specified.
+            ]]>
+          </description>
+          <association>
+            <type>ActivationProperty</type>
+          </association>
+        </field>
+        <field>
+          <name>file</name>
+          <version>1.0.0+</version>
+          <description>
+            <![CDATA[
+            Specifies that this profile will be activated based on existence of a file.
+            ]]>
+          </description>
+          <association>
+            <type>ActivationFile</type>
+          </association>
+        </field>
+      </fields>
+    </class>
+
+    <!-- TODO: reproduced from maven-model/maven.mdo, instead should inherit code and link to external docs -->
+    <class java.clone="deep">
+      <name>RepositoryBase</name>
+      <version>1.0.0+</version>
+      <description>
+        <![CDATA[
+        Repository contains the information needed
+        for establishing connections with remote repository
+        ]]>
+      </description>
+      <fields>
+        <field>
+          <name>id</name>
+          <version>1.0.0+</version>
+          <description>
+            <![CDATA[
+            A unique identifier for a repository.
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>name</name>
+          <version>1.0.0+</version>
+          <description>
+            <![CDATA[
+            Human readable name of the repository.
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>url</name>
+          <version>1.0.0+</version>
+          <description>
+            <![CDATA[
+            The url of the repository.
+            ]]>
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>layout</name>
+          <version>1.0.0+</version>
+          <description>
+            The type of layout this repository uses for locating and
+            storing artifacts - can be "legacy" or "default".
+          </description>
+          <type>String</type>
+          <defaultValue>default</defaultValue>
+        </field>
+      </fields>
+      <codeSegments>
+        <codeSegment>
+          <version>1.0.0+</version>
+          <code>
+            <![CDATA[
+    /**
+     * @see java.lang.Object#equals(java.lang.Object)
+     */
+    public boolean equals( Object obj )
+    {
+        RepositoryBase other =  (RepositoryBase) obj;
+        boolean retValue = false;
+        if ( this.getId() != null )
+        {
+            retValue = this.getId().equals( other.getId() );
+        }
+        return retValue;
+    }
+            ]]>
+          </code>
+        </codeSegment>
+      </codeSegments>
+    </class>
+
+    <class>
+      <name>Repository</name>
+      <superClass>RepositoryBase</superClass>
+      <version>1.0.0+</version>
+      <description>
+        Repository contains the information needed for establishing
+        connections with remote repository
+      </description>
+      <fields>
+        <field>
+          <name>releases</name>
+          <version>1.0.0+</version>
+          <description>
+            How to handle downloading of releases from this repository
+          </description>
+          <association>
+            <type>RepositoryPolicy</type>
+          </association>
+        </field>
+        <field>
+          <name>snapshots</name>
+          <version>1.0.0+</version>
+          <description>
+            How to handle downloading of snapshots from this repository
+          </description>
+          <association>
+            <type>RepositoryPolicy</type>
+          </association>
+        </field>
+      </fields>
+      <!-- prevent Modello generation of an incorrect equals method. Could be avoided by using <identity/> tags to mark ID as the only identity field -->
+      <codeSegments>
+        <codeSegment>
+          <version>1.0.0+</version>
+          <code>
+            <![CDATA[
+    /**
+     * @see RepositoryBase#equals(java.lang.Object)
+     */
+    public boolean equals( Object obj )
+    {
+        return super.equals( obj );
+    }
+            ]]>
+          </code>
+        </codeSegment>
+      </codeSegments>
+    </class>
+
+    <class java.clone="deep">
+      <name>RepositoryPolicy</name>
+      <version>1.0.0+</version>
+      <description>Download policy</description>
+      <fields>
+        <field>
+          <name>enabled</name>
+          <version>1.0.0+</version>
+          <description>
+            Whether to use this repository for downloading this type of
+            artifact.
+          </description>
+          <type>boolean</type>
+          <defaultValue>true</defaultValue>
+        </field>
+        <field>
+          <name>updatePolicy</name>
+          <version>1.0.0+</version>
+          <description>
+            The frequency for downloading updates - can be "always",
+            "daily" (default), "interval:XXX" (in minutes) or "never"
+            (only if it doesn't exist locally).
+          </description>
+          <type>String</type>
+        </field>
+        <field>
+          <name>checksumPolicy</name>
+          <version>1.0.0+</version>
+          <description>
+            What to do when verification of an artifact checksum fails. Valid values are "fail" (default for Maven 4 and
+            above), "warn" (default for Maven 2 and 3) or "ignore".
+          </description>
+          <type>String</type>
+        </field>
+      </fields>
+    </class>
+
+    <class java.clone="deep">
+      <name>ActivationProperty</name>
+      <version>1.0.0+</version>
+      <description>
+        <![CDATA[
+        This is the property specification used to activate a profile. If the value field is empty,
+        then the existence of the named property will activate the profile, otherwise it does a case-sensitive
+        match against the property value as well.
+        ]]>
+      </description>
+      <fields>
+        <field>
+          <name>name</name>
+          <version>1.0.0+</version>
+          <type>String</type>
+          <required>true</required>
+          <description>
+            The name of the property to be used to activate a profile.
+          </description>
+        </field>
+        <field>
+          <name>value</name>
+          <version>1.0.0+</version>
+          <type>String</type>
+          <description>
+            The value of the property to be used to activate a profile.
+          </description>
+        </field>
+      </fields>
+    </class>
+    <class java.clone="deep">
+      <name>ActivationOS</name>
+      <version>1.0.0+</version>
+      <description>
+        <![CDATA[
+        This is an activator which will detect an operating system's attributes in order to activate
+        its profile.
+        ]]>
+      </description>
+      <fields>
+        <field>
+          <name>name</name>
+          <version>1.0.0+</version>
+          <type>String</type>
+          <description>
+            The name of the OS to be used to activate a profile.
+          </description>
+        </field>
+        <field>
+          <name>family</name>
+          <version>1.0.0+</version>
+          <type>String</type>
+          <description>
+            The general family of the OS to be used to activate a
+            profile (e.g. 'windows')
+          </description>
+        </field>
+        <field>
+          <name>arch</name>
+          <version>1.0.0+</version>
+          <type>String</type>
+          <description>
+            The architecture of the OS to be used to activate a profile.
+          </description>
+        </field>
+        <field>
+          <name>version</name>
+          <version>1.0.0+</version>
+          <type>String</type>
+          <description>
+            The version of the OS to be used to activate a profile.
+          </description>
+        </field>
+      </fields>
+    </class>
+    <class java.clone="deep">
+      <name>ActivationFile</name>
+      <version>1.0.0+</version>
+      <description>
+        <![CDATA[
+        This is the file specification used to activate a profile. The missing value will be a the location
+        of a file that needs to exist, and if it doesn't the profile must run.  On the other hand exists will test
+        for the existence of the file and if it is there will run the profile.
+        ]]>
+      </description>
+      <fields>
+        <field>
+          <name>missing</name>
+          <version>1.0.0+</version>
+          <type>String</type>
+          <description>
+            The name of the file that should be missing to activate a
+            profile.
+          </description>
+        </field>
+        <field>
+          <name>exists</name>
+          <version>1.0.0+</version>
+          <type>String</type>
+          <description>
+            The name of the file that should exist to activate a profile.
+          </description>
+        </field>
+      </fields>
+    </class>
+    <!-- /BuildProfile support -->
+  </classes>
+</model>
diff --git a/core-it-suite/src/test/resources/mng-7629/child-2/pom.xml b/core-it-suite/src/test/resources/mng-7629/child-2/pom.xml
new file mode 100644
index 000000000..b559a57ac
--- /dev/null
+++ b/core-it-suite/src/test/resources/mng-7629/child-2/pom.xml
@@ -0,0 +1,71 @@
+<?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>org.apache.maven.its.mng7629</groupId>
+        <artifactId>test</artifactId>
+        <version>1.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>child-2</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.maven.its.mng7629</groupId>
+            <artifactId>child-1</artifactId>
+            <version>1.0-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <version>3.3.0</version>
+                <executions>
+                    <execution>
+                        <id>copy-model</id>
+                        <goals>
+                            <goal>copy</goal>
+                        </goals>
+                        <phase>generate-sources</phase>
+                        <configuration>
+                            <artifactItems>
+                                <artifactItem>
+                                    <groupId>org.apache.maven.its.mng7629</groupId>
+                                    <artifactId>child-1</artifactId>
+                                    <version>1.0-SNAPSHOT</version>
+                                    <type>mdo</type>
+                                    <outputDirectory>target/mdo/</outputDirectory>
+                                    <destFileName>settings.mdo</destFileName>
+                                </artifactItem>
+                            </artifactItems>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/core-it-suite/src/test/resources/mng-7629/pom.xml b/core-it-suite/src/test/resources/mng-7629/pom.xml
new file mode 100644
index 000000000..dae9ae7ce
--- /dev/null
+++ b/core-it-suite/src/test/resources/mng-7629/pom.xml
@@ -0,0 +1,34 @@
+<?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.mng7629</groupId>
+    <artifactId>test</artifactId>
+    <version>1.0-SNAPSHOT</version>
+    <packaging>pom</packaging>
+
+    <modules>
+        <module>child-1</module>
+        <module>child-2</module>
+    </modules>
+
+</project>