You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by rf...@apache.org on 2019/08/24 16:25:26 UTC

[maven] 02/12: [MNG-6656] separate module for maven-xml, maven-model-builder doesn't depend on maven-core

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

rfscholte pushed a commit to branch MNG-6656
in repository https://gitbox.apache.org/repos/asf/maven.git

commit 79c4813558486fcedcdd902f8f3188591c747a21
Author: rfscholte <rf...@apache.org>
AuthorDate: Sat Jun 1 19:08:21 2019 +0200

    [MNG-6656] separate module for maven-xml, maven-model-builder doesn't depend on maven-core
---
 maven-core/pom.xml                                 |   4 +
 .../DefaultRepositorySystemSessionFactory.java     |  53 ++++------
 maven-model-builder/pom.xml                        |   6 +-
 .../maven/model/building/DefaultModelBuilder.java  |  15 ++-
 maven-xml/pom.xml                                  |  62 ++++++++++++
 .../main/java/org/apache/maven/xml/SAXEvent.java   |  24 ++---
 .../java/org/apache/maven/xml/SAXEventFactory.java | 111 +++++++++++++++++++++
 .../java/org/apache/maven/xml/SAXEventUtils.java   |  22 ++--
 .../apache/maven/xml/filter/BuildPomXMLFilter.java |  11 +-
 .../maven/xml/filter/ConsumerPomXMLFilter.java     |  23 ++++-
 .../apache/maven/xml/filter/FastForwardFilter.java |   0
 .../apache/maven/xml/filter/ModulesXMLFilter.java  |   0
 .../maven/xml/filter/RelativePathXMLFilter.java    |   0
 .../maven/xml/filter/AbstractXMLFilterTests.java   |   0
 .../maven/xml/filter/ConsumerPomXMLFilterTest.java |   0
 .../maven/xml/filter/ModulesXMLFilterTest.java     |   0
 .../xml/filter/RelativePathXMLFilterTest.java      |   0
 pom.xml                                            |  27 +++++
 18 files changed, 280 insertions(+), 78 deletions(-)

diff --git a/maven-core/pom.xml b/maven-core/pom.xml
index e467851..79dc86e 100644
--- a/maven-core/pom.xml
+++ b/maven-core/pom.xml
@@ -62,6 +62,10 @@ under the License.
     </dependency>
     <dependency>
       <groupId>org.apache.maven</groupId>
+      <artifactId>maven-xml</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven</groupId>
       <artifactId>maven-plugin-api</artifactId>
     </dependency>
     <dependency>
diff --git a/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java b/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java
index 792b085..5ee5525 100644
--- a/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java
+++ b/maven-core/src/main/java/org/apache/maven/internal/aether/DefaultRepositorySystemSessionFactory.java
@@ -34,7 +34,6 @@ import java.util.Properties;
 
 import javax.inject.Inject;
 import javax.inject.Named;
-import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.transform.TransformerException;
 import javax.xml.transform.TransformerFactory;
 import javax.xml.transform.sax.SAXSource;
@@ -77,7 +76,6 @@ import org.eclipse.aether.util.repository.DefaultProxySelector;
 import org.eclipse.aether.util.repository.SimpleResolutionErrorPolicy;
 import org.eclipse.sisu.Nullable;
 import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
 
 /**
  * @since 3.3.0
@@ -283,41 +281,34 @@ public class DefaultRepositorySystemSessionFactory
                         public InputStream transformData( File file )
                             throws IOException, TransformException
                         {
-                            try
+                            final PipedOutputStream pipedOutputStream  = new PipedOutputStream();
+                            final PipedInputStream pipedInputStream  = new PipedInputStream( pipedOutputStream );
+                            
+                            final SAXSource transformSource =
+                                            new SAXSource( new ConsumerPomXMLFilter( null /* @TODO bass BuildPomXMLFilter */ ), 
+                                                           new InputSource( new FileReader( file ) ) );
+                            
+                            final StreamResult result = new StreamResult( pipedOutputStream );
+                            
+                            final Runnable runnable = new Runnable()
                             {
-                                final PipedOutputStream pipedOutputStream  = new PipedOutputStream();
-                                final PipedInputStream pipedInputStream  = new PipedInputStream( pipedOutputStream );
-                                
-                                final SAXSource transformSource =
-                                                new SAXSource( new ConsumerPomXMLFilter(), 
-                                                               new InputSource( new FileReader( file ) ) );
-                                
-                                final StreamResult result = new StreamResult( pipedOutputStream );
-                                
-                                final Runnable runnable = new Runnable()
+                                @Override
+                                public void run()
                                 {
-                                    @Override
-                                    public void run()
+                                    try ( PipedOutputStream out = pipedOutputStream )
                                     {
-                                        try ( PipedOutputStream out = pipedOutputStream )
-                                        {
-                                            transformerFactory.newTransformer().transform( transformSource, result );
-                                        }
-                                        catch ( TransformerException | IOException e )
-                                        {
-                                            throw new RuntimeException( e );
-                                        }
+                                        transformerFactory.newTransformer().transform( transformSource, result );
                                     }
-                                };
+                                    catch ( TransformerException | IOException e )
+                                    {
+                                        throw new RuntimeException( e );
+                                    }
+                                }
+                            };
 
-                                new Thread( runnable ).start();
+                            new Thread( runnable ).start();
 
-                                return pipedInputStream;
-                            }
-                            catch ( SAXException | ParserConfigurationException  e )
-                            {
-                                throw new TransformException( e );
-                            }
+                            return pipedInputStream;
                         }
 
                         @Override
diff --git a/maven-model-builder/pom.xml b/maven-model-builder/pom.xml
index 9a85016..0f10fa9 100644
--- a/maven-model-builder/pom.xml
+++ b/maven-model-builder/pom.xml
@@ -59,6 +59,11 @@ under the License.
       <artifactId>maven-builder-support</artifactId>
     </dependency>
     <dependency>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-xml</artifactId>
+    </dependency>
+    <!-- Testing -->
+    <dependency>
       <groupId>org.eclipse.sisu</groupId>
       <artifactId>org.eclipse.sisu.inject</artifactId>
     </dependency>
@@ -67,7 +72,6 @@ under the License.
       <artifactId>org.eclipse.sisu.plexus</artifactId>
       <scope>test</scope>
     </dependency>
-    <!-- Testing -->
     <dependency>
       <groupId>com.google.inject</groupId>
       <artifactId>guice</artifactId>
diff --git a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
index f981944..7022781 100644
--- a/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
+++ b/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java
@@ -549,6 +549,7 @@ public class DefaultModelBuilder
 
             try
             {
+                // RFS adjust inputstream
                 model = modelProcessor.read( modelSource.getInputStream(), options );
             }
             catch ( ModelParseException e )
@@ -733,12 +734,24 @@ public class DefaultModelBuilder
     private void assembleInheritance( List<ModelData> lineage, ModelBuildingRequest request,
                                       ModelProblemCollector problems )
     {
-        for ( int i = lineage.size() - 2; i >= 0; i-- )
+        for ( int i = lineage.size() - 2; i >= 1; i-- )
         {
             Model parent = lineage.get( i + 1 ).getModel();
             Model child = lineage.get( i ).getModel();
             inheritanceAssembler.assembleModelInheritance( child, parent, request, problems );
         }
+        
+        // re-read model from file
+        if ( Boolean.getBoolean( "maven.experimental.buildconsumer" ) )
+        {
+            throw new UnsupportedOperationException();
+        }
+        else
+        {
+            Model parent = lineage.get( 1 ).getModel();
+            Model child = lineage.get( 0 ).getModel();
+            inheritanceAssembler.assembleModelInheritance( child, parent, request, problems );
+        }
     }
 
     private Map<String, Activation> getProfileActivations( Model model, boolean clone )
diff --git a/maven-xml/pom.xml b/maven-xml/pom.xml
new file mode 100644
index 0000000..aeef99e
--- /dev/null
+++ b/maven-xml/pom.xml
@@ -0,0 +1,62 @@
+<?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</groupId>
+    <artifactId>maven</artifactId>
+    <version>3.6.2-SNAPSHOT</version>
+  </parent>
+  <artifactId>maven-xml</artifactId>
+  <name>Maven XML</name>
+  
+  <properties>
+    <maven.compiler.source>1.8</maven.compiler.source>
+    <maven.compiler.target>1.8</maven.compiler.target>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>animal-sniffer-maven-plugin</artifactId>
+        <configuration>
+          <signature>
+            <groupId>org.codehaus.mojo.signature</groupId>
+            <artifactId>java18</artifactId>
+            <version>1.0</version>
+          </signature>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+  
+  <dependencies>
+    <dependency>
+      <groupId>org.xmlunit</groupId>
+      <artifactId>xmlunit-assertj</artifactId>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+</project>
\ No newline at end of file
diff --git a/maven-core/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilter.java b/maven-xml/src/main/java/org/apache/maven/xml/SAXEvent.java
similarity index 67%
copy from maven-core/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilter.java
copy to maven-xml/src/main/java/org/apache/maven/xml/SAXEvent.java
index 60f0c49..07da280 100644
--- a/maven-core/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilter.java
+++ b/maven-xml/src/main/java/org/apache/maven/xml/SAXEvent.java
@@ -1,4 +1,4 @@
-package org.apache.maven.xml.filter;
+package org.apache.maven.xml;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -19,26 +19,16 @@ package org.apache.maven.xml.filter;
  * under the License.
  */
 
-import org.xml.sax.XMLReader;
-import org.xml.sax.helpers.XMLFilterImpl;
+import org.xml.sax.SAXException;
 
 /**
- * Filter to adjust pom on filesystem before being processed for effective pom.
+ * Command pattern to gather events which can be executed later on.
  * 
  * @author Robert Scholte
- * @since 3.7.0
+ * @since 
  */
-public class BuildPomXMLFilter extends XMLFilterImpl
+@FunctionalInterface
+public interface SAXEvent
 {
-    public BuildPomXMLFilter()
-    {
-        super();
-    }
-
-    public BuildPomXMLFilter( XMLReader parent )
-    {
-        super( parent );
-    }
-
-    
+    void execute() throws SAXException;
 }
diff --git a/maven-xml/src/main/java/org/apache/maven/xml/SAXEventFactory.java b/maven-xml/src/main/java/org/apache/maven/xml/SAXEventFactory.java
new file mode 100644
index 0000000..42739e1
--- /dev/null
+++ b/maven-xml/src/main/java/org/apache/maven/xml/SAXEventFactory.java
@@ -0,0 +1,111 @@
+package org.apache.maven.xml;
+
+/*
+ * 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.
+ */
+
+import org.xml.sax.Attributes;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.Locator;
+
+/**
+ * Factory for SAXEvents
+ * 
+ * @author Robert Scholte
+ * @since 4.0.0
+ */
+public final class SAXEventFactory
+{
+    private final ContentHandler contentHandler;
+
+    protected SAXEventFactory( ContentHandler contentHandler )
+    {
+        this.contentHandler = contentHandler;
+    }
+
+    public SAXEvent characters( final char[] ch, final int start, final int length )
+    {
+        final char[] txt;
+        if ( start > 0 )
+        {
+            txt = new char[length];
+            System.arraycopy( ch, start, txt, 0, length );
+        }
+        else
+        {
+            txt = ch;
+        }
+            
+        return () -> contentHandler.characters( txt, 0, length );
+    }
+
+    public SAXEvent endDocument()
+    {
+        return () -> contentHandler.endDocument();
+    }
+
+    public SAXEvent endElement( final String uri, final String localName, final String qName )
+    {
+        return () -> contentHandler.endElement( uri, localName, qName );
+    }
+
+    public SAXEvent endPrefixMapping( final String prefix )
+    {
+        return () ->  contentHandler.endPrefixMapping( prefix );
+    }
+
+    public SAXEvent ignorableWhitespace( final char[] ch, final int start, final int length )
+    {
+        return () ->  contentHandler.ignorableWhitespace( ch, start, length );
+    }
+
+    public SAXEvent processingInstruction( final String target, final String data )
+    {
+        return () -> contentHandler.processingInstruction( target, data );
+    }
+
+    public SAXEvent setDocumentLocator( final Locator locator )
+    {
+        return () -> contentHandler.setDocumentLocator( locator );
+    }
+
+    public SAXEvent skippedEntity( final String name )
+    {
+        return () -> contentHandler.skippedEntity( name );
+    }
+
+    public SAXEvent startDocument()
+    {
+        return () -> contentHandler.startDocument();
+    }
+
+    public SAXEvent startElement( final String uri, final String localName, final String qName, final Attributes atts )
+    {
+        return () -> contentHandler.startElement( uri, localName, qName, atts );
+    }
+
+    public SAXEvent startPrefixMapping( final String prefix, final String uri )
+    {
+        return () -> contentHandler.startPrefixMapping( prefix, uri );
+    }
+    
+    public static SAXEventFactory newInstance( ContentHandler handler )
+    {
+        return new SAXEventFactory( handler );
+    }
+}
diff --git a/maven-core/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilter.java b/maven-xml/src/main/java/org/apache/maven/xml/SAXEventUtils.java
similarity index 69%
copy from maven-core/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilter.java
copy to maven-xml/src/main/java/org/apache/maven/xml/SAXEventUtils.java
index 60f0c49..06f4f26 100644
--- a/maven-core/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilter.java
+++ b/maven-xml/src/main/java/org/apache/maven/xml/SAXEventUtils.java
@@ -1,4 +1,4 @@
-package org.apache.maven.xml.filter;
+package org.apache.maven.xml;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -19,26 +19,20 @@ package org.apache.maven.xml.filter;
  * under the License.
  */
 
-import org.xml.sax.XMLReader;
-import org.xml.sax.helpers.XMLFilterImpl;
-
 /**
- * Filter to adjust pom on filesystem before being processed for effective pom.
+ * Utility class for SAXEvents
  * 
  * @author Robert Scholte
- * @since 3.7.0
+ * @since 4.0.0
  */
-public class BuildPomXMLFilter extends XMLFilterImpl
+public final class SAXEventUtils
 {
-    public BuildPomXMLFilter()
+    private SAXEventUtils()
     {
-        super();
     }
-
-    public BuildPomXMLFilter( XMLReader parent )
+    
+    public static String renameQName( String oldQName, String newLocalName )
     {
-        super( parent );
+        return oldQName.replaceFirst( "[^:]+$", newLocalName );
     }
-
-    
 }
diff --git a/maven-core/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilter.java b/maven-xml/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilter.java
similarity index 85%
rename from maven-core/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilter.java
rename to maven-xml/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilter.java
index 60f0c49..58d219b 100644
--- a/maven-core/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilter.java
+++ b/maven-xml/src/main/java/org/apache/maven/xml/filter/BuildPomXMLFilter.java
@@ -19,7 +19,6 @@ package org.apache.maven.xml.filter;
  * under the License.
  */
 
-import org.xml.sax.XMLReader;
 import org.xml.sax.helpers.XMLFilterImpl;
 
 /**
@@ -30,15 +29,7 @@ import org.xml.sax.helpers.XMLFilterImpl;
  */
 public class BuildPomXMLFilter extends XMLFilterImpl
 {
-    public BuildPomXMLFilter()
-    {
-        super();
-    }
-
-    public BuildPomXMLFilter( XMLReader parent )
-    {
-        super( parent );
-    }
+    
 
     
 }
diff --git a/maven-core/src/main/java/org/apache/maven/xml/filter/ConsumerPomXMLFilter.java b/maven-xml/src/main/java/org/apache/maven/xml/filter/ConsumerPomXMLFilter.java
similarity index 79%
rename from maven-core/src/main/java/org/apache/maven/xml/filter/ConsumerPomXMLFilter.java
rename to maven-xml/src/main/java/org/apache/maven/xml/filter/ConsumerPomXMLFilter.java
index 8709b9c..a367419 100644
--- a/maven-core/src/main/java/org/apache/maven/xml/filter/ConsumerPomXMLFilter.java
+++ b/maven-xml/src/main/java/org/apache/maven/xml/filter/ConsumerPomXMLFilter.java
@@ -31,6 +31,7 @@ import org.xml.sax.helpers.XMLFilterImpl;
 /**
  * XML Filter to transform pom.xml to consumer pom.
  * This often means stripping of build-specific information.
+ * When extra information is required during filtering it is probably a member of the BuildPomXMLFilter
  * 
  * This filter is used at 2 locations:
  * - {@link org.apache.maven.internal.aether.DefaultRepositorySystemSessionFactory} when publishing pom files.
@@ -43,15 +44,29 @@ public class ConsumerPomXMLFilter extends XMLFilterImpl
 {
     private final XMLFilter rootFilter;
 
-    public ConsumerPomXMLFilter() throws SAXException, ParserConfigurationException
+    // only for testing purpose
+    ConsumerPomXMLFilter() throws SAXException, ParserConfigurationException
     {
         this( SAXParserFactory.newInstance().newSAXParser().getXMLReader() );
     }
-
-    public ConsumerPomXMLFilter( XMLReader parent )
+    
+    // only for testing purpose
+    ConsumerPomXMLFilter( XMLReader parent )
     {
-        rootFilter = new BuildPomXMLFilter( parent );
+        this.rootFilter = new XMLFilterImpl( parent );
         
+        applyFilters();
+    }
+    
+    public ConsumerPomXMLFilter( BuildPomXMLFilter buildPomXMLFilter )
+    {
+        this.rootFilter = buildPomXMLFilter;
+        
+        applyFilters();
+    }
+    
+    private void applyFilters()
+    {
         // Ensure that xs:any elements aren't touched by next filters
         XMLFilter filter = new FastForwardFilter( rootFilter );
         
diff --git a/maven-core/src/main/java/org/apache/maven/xml/filter/FastForwardFilter.java b/maven-xml/src/main/java/org/apache/maven/xml/filter/FastForwardFilter.java
similarity index 100%
rename from maven-core/src/main/java/org/apache/maven/xml/filter/FastForwardFilter.java
rename to maven-xml/src/main/java/org/apache/maven/xml/filter/FastForwardFilter.java
diff --git a/maven-core/src/main/java/org/apache/maven/xml/filter/ModulesXMLFilter.java b/maven-xml/src/main/java/org/apache/maven/xml/filter/ModulesXMLFilter.java
similarity index 100%
rename from maven-core/src/main/java/org/apache/maven/xml/filter/ModulesXMLFilter.java
rename to maven-xml/src/main/java/org/apache/maven/xml/filter/ModulesXMLFilter.java
diff --git a/maven-core/src/main/java/org/apache/maven/xml/filter/RelativePathXMLFilter.java b/maven-xml/src/main/java/org/apache/maven/xml/filter/RelativePathXMLFilter.java
similarity index 100%
rename from maven-core/src/main/java/org/apache/maven/xml/filter/RelativePathXMLFilter.java
rename to maven-xml/src/main/java/org/apache/maven/xml/filter/RelativePathXMLFilter.java
diff --git a/maven-core/src/test/java/org/apache/maven/xml/filter/AbstractXMLFilterTests.java b/maven-xml/src/test/java/org/apache/maven/xml/filter/AbstractXMLFilterTests.java
similarity index 100%
rename from maven-core/src/test/java/org/apache/maven/xml/filter/AbstractXMLFilterTests.java
rename to maven-xml/src/test/java/org/apache/maven/xml/filter/AbstractXMLFilterTests.java
diff --git a/maven-core/src/test/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterTest.java b/maven-xml/src/test/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterTest.java
similarity index 100%
rename from maven-core/src/test/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterTest.java
rename to maven-xml/src/test/java/org/apache/maven/xml/filter/ConsumerPomXMLFilterTest.java
diff --git a/maven-core/src/test/java/org/apache/maven/xml/filter/ModulesXMLFilterTest.java b/maven-xml/src/test/java/org/apache/maven/xml/filter/ModulesXMLFilterTest.java
similarity index 100%
rename from maven-core/src/test/java/org/apache/maven/xml/filter/ModulesXMLFilterTest.java
rename to maven-xml/src/test/java/org/apache/maven/xml/filter/ModulesXMLFilterTest.java
diff --git a/maven-core/src/test/java/org/apache/maven/xml/filter/RelativePathXMLFilterTest.java b/maven-xml/src/test/java/org/apache/maven/xml/filter/RelativePathXMLFilterTest.java
similarity index 100%
rename from maven-core/src/test/java/org/apache/maven/xml/filter/RelativePathXMLFilterTest.java
rename to maven-xml/src/test/java/org/apache/maven/xml/filter/RelativePathXMLFilterTest.java
diff --git a/pom.xml b/pom.xml
index 9677856..da0b9de 100644
--- a/pom.xml
+++ b/pom.xml
@@ -92,6 +92,7 @@ under the License.
     <module>maven-embedder</module>
     <module>maven-compat</module>
     <module>apache-maven</module>
+    <module>maven-xml</module>
   </modules>
 
   <scm>
@@ -229,6 +230,11 @@ under the License.
         <artifactId>maven-slf4j-provider</artifactId>
         <version>${project.version}</version>
       </dependency>
+      <dependency>
+        <groupId>org.apache.maven</groupId>
+        <artifactId>maven-xml</artifactId>
+        <version>${project.version}</version>
+      </dependency>
       <!--bootstrap-end-comment-->
       <!--  Plexus -->
       <dependency>
@@ -443,6 +449,27 @@ under the License.
     <pluginManagement>
       <plugins>
         <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-enforcer-plugin</artifactId>
+          <executions>
+            <execution>
+              <id>enforce-bytecode-version</id>
+              <goals>
+                <goal>enforce</goal>
+              </goals>
+              <configuration>
+                <rules>
+                  <enforceBytecodeVersion>
+                    <excludes>
+                      <exclude>org.apache.maven:maven-xml</exclude> <!-- Java 8 compatible -->
+                    </excludes>
+                  </enforceBytecodeVersion>
+                </rules>
+              </configuration>
+            </execution>
+          </executions>
+        </plugin>
+        <plugin>
           <groupId>org.codehaus.plexus</groupId>
           <artifactId>plexus-component-metadata</artifactId>
           <version>${plexusVersion}</version>