You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by sc...@apache.org on 2016/12/11 22:37:28 UTC

[4/7] maven git commit: [MNG-6110] Upgrade Aether to Maven Resolver 1.2

http://git-wip-us.apache.org/repos/asf/maven/blob/58554032/maven-core/src/main/resources/META-INF/maven/extension.xml
----------------------------------------------------------------------
diff --git a/maven-core/src/main/resources/META-INF/maven/extension.xml b/maven-core/src/main/resources/META-INF/maven/extension.xml
index eaa807b..55e0096 100644
--- a/maven-core/src/main/resources/META-INF/maven/extension.xml
+++ b/maven-core/src/main/resources/META-INF/maven/extension.xml
@@ -54,7 +54,7 @@ under the License.
     <exportedPackage>org.apache.maven.wagon.repository</exportedPackage>
     <exportedPackage>org.apache.maven.wagon.resource</exportedPackage>
 
-    <!-- aether-api, aether-spi, aether-impl -->
+    <!-- maven-resolver-api, maven-resolver-spi, maven-resolver-impl -->
     <exportedPackage>org.eclipse.aether.*</exportedPackage>
     <exportedPackage>org.eclipse.aether.artifact</exportedPackage>
     <exportedPackage>org.eclipse.aether.collection</exportedPackage>
@@ -134,7 +134,7 @@ under the License.
     <exportedArtifact>org.sonatype.sisu:sisu-inject-plexus</exportedArtifact>
     <exportedArtifact>org.eclipse.sisu:org.eclipse.sisu.plexus</exportedArtifact>
     <exportedArtifact>org.apache.maven:maven-artifact</exportedArtifact>
-    <exportedArtifact>org.apache.maven:maven-aether-provider</exportedArtifact>
+    <exportedArtifact>org.apache.maven:maven-resolver-provider</exportedArtifact>
     <exportedArtifact>org.apache.maven:maven-artifact-manager</exportedArtifact>
     <exportedArtifact>org.apache.maven:maven-compat</exportedArtifact>
     <exportedArtifact>org.apache.maven:maven-core</exportedArtifact>
@@ -154,9 +154,9 @@ under the License.
     <exportedArtifact>org.apache.maven:maven-settings-builder</exportedArtifact>
     <exportedArtifact>org.apache.maven:maven-toolchain</exportedArtifact>
     <exportedArtifact>org.apache.maven.wagon:wagon-provider-api</exportedArtifact>
-    <exportedArtifact>org.eclipse.aether:aether-api</exportedArtifact>
-    <exportedArtifact>org.eclipse.aether:aether-spi</exportedArtifact>
-    <exportedArtifact>org.eclipse.aether:aether-impl</exportedArtifact>
+    <exportedArtifact>org.apache.maven.resolver:maven-resolver-api</exportedArtifact>
+    <exportedArtifact>org.apache.maven.resolver:maven-resolver-spi</exportedArtifact>
+    <exportedArtifact>org.apache.maven.resolver:maven-resolver-impl</exportedArtifact>
 
     <exportedArtifact>javax.inject:javax.inject</exportedArtifact>
     <exportedArtifact>javax.annotation:jsr250-api</exportedArtifact>
@@ -169,6 +169,9 @@ under the License.
     <exportedArtifact>org.sonatype.aether:aether-api</exportedArtifact>
     <exportedArtifact>org.sonatype.aether:aether-spi</exportedArtifact>
     <exportedArtifact>org.sonatype.aether:aether-impl</exportedArtifact>
+    <exportedArtifact>org.eclipse.aether:aether-api</exportedArtifact>
+    <exportedArtifact>org.eclipse.aether:aether-spi</exportedArtifact>
+    <exportedArtifact>org.eclipse.aether:aether-impl</exportedArtifact>
 
     <!--
       | NOTE: Don't exclude the wagons or any of their dependencies (apart from the wagon API). This would otherwise

http://git-wip-us.apache.org/repos/asf/maven/blob/58554032/maven-resolver-provider/pom.xml
----------------------------------------------------------------------
diff --git a/maven-resolver-provider/pom.xml b/maven-resolver-provider/pom.xml
new file mode 100644
index 0000000..8997c34
--- /dev/null
+++ b/maven-resolver-provider/pom.xml
@@ -0,0 +1,139 @@
+<?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.4.0-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>maven-resolver-provider</artifactId>
+
+  <name>Maven Resolver Provider</name>
+  <description>Extensions to Maven Resolver for utilizing Maven POM and repository metadata.</description>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-model</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-model-builder</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven</groupId>
+      <artifactId>maven-repository-metadata</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.resolver</groupId>
+      <artifactId>maven-resolver-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.resolver</groupId>
+      <artifactId>maven-resolver-spi</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.resolver</groupId>
+      <artifactId>maven-resolver-util</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.resolver</groupId>
+      <artifactId>maven-resolver-impl</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.codehaus.plexus</groupId>
+      <artifactId>plexus-component-annotations</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.codehaus.plexus</groupId>
+      <artifactId>plexus-utils</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>com.google.inject</groupId>
+      <artifactId>guice</artifactId>
+      <classifier>no_aop</classifier>
+      <optional>true</optional>
+      <exclusions>
+        <exclusion>
+          <groupId>aopalliance</groupId>
+          <artifactId>aopalliance</artifactId>
+        </exclusion>
+      </exclusions>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>com.google.guava</groupId>
+      <artifactId>guava</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.sisu</groupId>
+      <artifactId>org.eclipse.sisu.inject</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.eclipse.sisu</groupId>
+      <artifactId>org.eclipse.sisu.plexus</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>javax.inject</groupId>
+      <artifactId>javax.inject</artifactId>
+    </dependency>
+    <!-- Testing -->
+    <dependency>
+      <groupId>org.apache.maven.resolver</groupId>
+      <artifactId>maven-resolver-connector-basic</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.resolver</groupId>
+      <artifactId>maven-resolver-transport-wagon</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.wagon</groupId>
+      <artifactId>wagon-file</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-core</artifactId>
+      <version>1.10.19</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.codehaus.plexus</groupId>
+        <artifactId>plexus-component-metadata</artifactId>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>
+

http://git-wip-us.apache.org/repos/asf/maven/blob/58554032/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/ArtifactDescriptorReaderDelegate.java
----------------------------------------------------------------------
diff --git a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/ArtifactDescriptorReaderDelegate.java b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/ArtifactDescriptorReaderDelegate.java
new file mode 100644
index 0000000..284ee86
--- /dev/null
+++ b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/ArtifactDescriptorReaderDelegate.java
@@ -0,0 +1,157 @@
+package org.apache.maven.repository.internal;
+
+/*
+ * 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 java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.maven.model.DependencyManagement;
+import org.apache.maven.model.DistributionManagement;
+import org.apache.maven.model.License;
+import org.apache.maven.model.Model;
+import org.apache.maven.model.Prerequisites;
+import org.apache.maven.model.Repository;
+import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.artifact.ArtifactProperties;
+import org.eclipse.aether.artifact.ArtifactType;
+import org.eclipse.aether.artifact.ArtifactTypeRegistry;
+import org.eclipse.aether.artifact.DefaultArtifact;
+import org.eclipse.aether.artifact.DefaultArtifactType;
+import org.eclipse.aether.graph.Dependency;
+import org.eclipse.aether.graph.Exclusion;
+import org.eclipse.aether.resolution.ArtifactDescriptorResult;
+
+/**
+ * Populates Aether {@link ArtifactDescriptorResult} from Maven project {@link Model}.
+ *
+ * @since 3.2.4
+ * @provisional This class is part of work in progress and can be changed or removed without notice.
+ */
+public class ArtifactDescriptorReaderDelegate
+{
+    public void populateResult( RepositorySystemSession session, ArtifactDescriptorResult result, Model model )
+    {
+        ArtifactTypeRegistry stereotypes = session.getArtifactTypeRegistry();
+
+        for ( Repository r : model.getRepositories() )
+        {
+            result.addRepository( ArtifactDescriptorUtils.toRemoteRepository( r ) );
+        }
+
+        for ( org.apache.maven.model.Dependency dependency : model.getDependencies() )
+        {
+            result.addDependency( convert( dependency, stereotypes ) );
+        }
+
+        DependencyManagement mngt = model.getDependencyManagement();
+        if ( mngt != null )
+        {
+            for ( org.apache.maven.model.Dependency dependency : mngt.getDependencies() )
+            {
+                result.addManagedDependency( convert( dependency, stereotypes ) );
+            }
+        }
+
+        Map<String, Object> properties = new LinkedHashMap<>();
+
+        Prerequisites prerequisites = model.getPrerequisites();
+        if ( prerequisites != null )
+        {
+            properties.put( "prerequisites.maven", prerequisites.getMaven() );
+        }
+
+        List<License> licenses = model.getLicenses();
+        properties.put( "license.count", licenses.size() );
+        for ( int i = 0; i < licenses.size(); i++ )
+        {
+            License license = licenses.get( i );
+            properties.put( "license." + i + ".name", license.getName() );
+            properties.put( "license." + i + ".url", license.getUrl() );
+            properties.put( "license." + i + ".comments", license.getComments() );
+            properties.put( "license." + i + ".distribution", license.getDistribution() );
+        }
+
+        result.setProperties( properties );
+
+        setArtifactProperties( result, model );
+    }
+
+    private Dependency convert( org.apache.maven.model.Dependency dependency, ArtifactTypeRegistry stereotypes )
+    {
+        ArtifactType stereotype = stereotypes.get( dependency.getType() );
+        if ( stereotype == null )
+        {
+            stereotype = new DefaultArtifactType( dependency.getType() );
+        }
+
+        boolean system = dependency.getSystemPath() != null && dependency.getSystemPath().length() > 0;
+
+        Map<String, String> props = null;
+        if ( system )
+        {
+            props = Collections.singletonMap( ArtifactProperties.LOCAL_PATH, dependency.getSystemPath() );
+        }
+
+        Artifact artifact =
+            new DefaultArtifact( dependency.getGroupId(), dependency.getArtifactId(), dependency.getClassifier(), null,
+                                 dependency.getVersion(), props, stereotype );
+
+        List<Exclusion> exclusions = new ArrayList<>( dependency.getExclusions().size() );
+        for ( org.apache.maven.model.Exclusion exclusion : dependency.getExclusions() )
+        {
+            exclusions.add( convert( exclusion ) );
+        }
+
+        Dependency result = new Dependency( artifact, dependency.getScope(),
+                                            dependency.getOptional() != null
+                                                ? dependency.isOptional()
+                                                : null,
+                                            exclusions );
+
+        return result;
+    }
+
+    private Exclusion convert( org.apache.maven.model.Exclusion exclusion )
+    {
+        return new Exclusion( exclusion.getGroupId(), exclusion.getArtifactId(), "*", "*" );
+    }
+
+    private void setArtifactProperties( ArtifactDescriptorResult result, Model model )
+    {
+        String downloadUrl = null;
+        DistributionManagement distMngt = model.getDistributionManagement();
+        if ( distMngt != null )
+        {
+            downloadUrl = distMngt.getDownloadUrl();
+        }
+        if ( downloadUrl != null && downloadUrl.length() > 0 )
+        {
+            Artifact artifact = result.getArtifact();
+            Map<String, String> props = new HashMap<>( artifact.getProperties() );
+            props.put( ArtifactProperties.DOWNLOAD_URL, downloadUrl );
+            result.setArtifact( artifact.setProperties( props ) );
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/maven/blob/58554032/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/ArtifactDescriptorUtils.java
----------------------------------------------------------------------
diff --git a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/ArtifactDescriptorUtils.java b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/ArtifactDescriptorUtils.java
new file mode 100644
index 0000000..7d4ede8
--- /dev/null
+++ b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/ArtifactDescriptorUtils.java
@@ -0,0 +1,81 @@
+package org.apache.maven.repository.internal;
+
+/*
+ * 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.apache.maven.model.Repository;
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.artifact.DefaultArtifact;
+import org.eclipse.aether.repository.RemoteRepository;
+import org.eclipse.aether.repository.RepositoryPolicy;
+
+/**
+ * <strong>Warning:</strong> This is an internal utility class that is only public for technical reasons, it is not part
+ * of the public API. In particular, this class can be changed or deleted without prior notice.
+ *
+ * @author Benjamin Bentmann
+ */
+public class ArtifactDescriptorUtils
+{
+
+    public static Artifact toPomArtifact( Artifact artifact )
+    {
+        Artifact pomArtifact = artifact;
+
+        if ( pomArtifact.getClassifier().length() > 0 || !"pom".equals( pomArtifact.getExtension() ) )
+        {
+            pomArtifact =
+                new DefaultArtifact( artifact.getGroupId(), artifact.getArtifactId(), "pom", artifact.getVersion() );
+        }
+
+        return pomArtifact;
+    }
+
+    public static RemoteRepository toRemoteRepository( Repository repository )
+    {
+        RemoteRepository.Builder builder =
+            new RemoteRepository.Builder( repository.getId(), repository.getLayout(), repository.getUrl() );
+        builder.setSnapshotPolicy( toRepositoryPolicy( repository.getSnapshots() ) );
+        builder.setReleasePolicy( toRepositoryPolicy( repository.getReleases() ) );
+        return builder.build();
+    }
+
+    public static RepositoryPolicy toRepositoryPolicy( org.apache.maven.model.RepositoryPolicy policy )
+    {
+        boolean enabled = true;
+        String checksums = RepositoryPolicy.CHECKSUM_POLICY_WARN;
+        String updates = RepositoryPolicy.UPDATE_POLICY_DAILY;
+
+        if ( policy != null )
+        {
+            enabled = policy.isEnabled();
+            if ( policy.getUpdatePolicy() != null )
+            {
+                updates = policy.getUpdatePolicy();
+            }
+            if ( policy.getChecksumPolicy() != null )
+            {
+                checksums = policy.getChecksumPolicy();
+            }
+        }
+
+        return new RepositoryPolicy( enabled, updates, checksums );
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/maven/blob/58554032/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultArtifactDescriptorReader.java
----------------------------------------------------------------------
diff --git a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultArtifactDescriptorReader.java b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultArtifactDescriptorReader.java
new file mode 100644
index 0000000..0f31330
--- /dev/null
+++ b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultArtifactDescriptorReader.java
@@ -0,0 +1,415 @@
+package org.apache.maven.repository.internal;
+
+/*
+ * 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 java.util.LinkedHashSet;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import org.apache.commons.lang3.Validate;
+import org.apache.maven.model.DistributionManagement;
+import org.apache.maven.model.Model;
+import org.apache.maven.model.Relocation;
+import org.apache.maven.model.building.DefaultModelBuilderFactory;
+import org.apache.maven.model.building.DefaultModelBuildingRequest;
+import org.apache.maven.model.building.FileModelSource;
+import org.apache.maven.model.building.ModelBuilder;
+import org.apache.maven.model.building.ModelBuildingException;
+import org.apache.maven.model.building.ModelBuildingRequest;
+import org.apache.maven.model.building.ModelProblem;
+import org.apache.maven.model.resolution.UnresolvableModelException;
+import org.codehaus.plexus.component.annotations.Component;
+import org.codehaus.plexus.component.annotations.Requirement;
+import org.eclipse.aether.RepositoryEvent;
+import org.eclipse.aether.RepositoryEvent.EventType;
+import org.eclipse.aether.RepositoryException;
+import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.RequestTrace;
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.impl.ArtifactDescriptorReader;
+import org.eclipse.aether.impl.ArtifactResolver;
+import org.eclipse.aether.impl.RemoteRepositoryManager;
+import org.eclipse.aether.impl.RepositoryEventDispatcher;
+import org.eclipse.aether.impl.VersionRangeResolver;
+import org.eclipse.aether.impl.VersionResolver;
+import org.eclipse.aether.repository.WorkspaceReader;
+import org.eclipse.aether.repository.WorkspaceRepository;
+import org.eclipse.aether.resolution.ArtifactDescriptorException;
+import org.eclipse.aether.resolution.ArtifactDescriptorPolicy;
+import org.eclipse.aether.resolution.ArtifactDescriptorPolicyRequest;
+import org.eclipse.aether.resolution.ArtifactDescriptorRequest;
+import org.eclipse.aether.resolution.ArtifactDescriptorResult;
+import org.eclipse.aether.resolution.ArtifactRequest;
+import org.eclipse.aether.resolution.ArtifactResolutionException;
+import org.eclipse.aether.resolution.ArtifactResult;
+import org.eclipse.aether.resolution.VersionRequest;
+import org.eclipse.aether.resolution.VersionResolutionException;
+import org.eclipse.aether.resolution.VersionResult;
+import org.eclipse.aether.spi.locator.Service;
+import org.eclipse.aether.spi.locator.ServiceLocator;
+import org.eclipse.aether.spi.log.Logger;
+import org.eclipse.aether.spi.log.LoggerFactory;
+import org.eclipse.aether.spi.log.NullLoggerFactory;
+import org.eclipse.aether.transfer.ArtifactNotFoundException;
+
+/**
+ * @author Benjamin Bentmann
+ */
+@Named
+@Component( role = ArtifactDescriptorReader.class )
+public class DefaultArtifactDescriptorReader
+    implements ArtifactDescriptorReader, Service
+{
+
+    @SuppressWarnings( "unused" )
+    @Requirement( role = LoggerFactory.class )
+    private Logger logger = NullLoggerFactory.LOGGER;
+
+    @Requirement
+    private RemoteRepositoryManager remoteRepositoryManager;
+
+    @Requirement
+    private VersionResolver versionResolver;
+
+    @Requirement
+    private VersionRangeResolver versionRangeResolver;
+
+    @Requirement
+    private ArtifactResolver artifactResolver;
+
+    @Requirement
+    private RepositoryEventDispatcher repositoryEventDispatcher;
+
+    @Requirement
+    private ModelBuilder modelBuilder;
+
+    public DefaultArtifactDescriptorReader()
+    {
+        // enable no-arg constructor
+    }
+
+    @Inject
+    DefaultArtifactDescriptorReader( RemoteRepositoryManager remoteRepositoryManager, VersionResolver versionResolver,
+                                     ArtifactResolver artifactResolver, ModelBuilder modelBuilder,
+                                     RepositoryEventDispatcher repositoryEventDispatcher, LoggerFactory loggerFactory )
+    {
+        setRemoteRepositoryManager( remoteRepositoryManager );
+        setVersionResolver( versionResolver );
+        setArtifactResolver( artifactResolver );
+        setModelBuilder( modelBuilder );
+        setLoggerFactory( loggerFactory );
+        setRepositoryEventDispatcher( repositoryEventDispatcher );
+    }
+
+    public void initService( ServiceLocator locator )
+    {
+        setLoggerFactory( locator.getService( LoggerFactory.class ) );
+        setRemoteRepositoryManager( locator.getService( RemoteRepositoryManager.class ) );
+        setVersionResolver( locator.getService( VersionResolver.class ) );
+        setVersionRangeResolver( locator.getService( VersionRangeResolver.class ) );
+        setArtifactResolver( locator.getService( ArtifactResolver.class ) );
+        setRepositoryEventDispatcher( locator.getService( RepositoryEventDispatcher.class ) );
+        modelBuilder = locator.getService( ModelBuilder.class );
+        if ( modelBuilder == null )
+        {
+            setModelBuilder( new DefaultModelBuilderFactory().newInstance() );
+        }
+    }
+
+    public DefaultArtifactDescriptorReader setLoggerFactory( LoggerFactory loggerFactory )
+    {
+        this.logger = NullLoggerFactory.getSafeLogger( loggerFactory, getClass() );
+        return this;
+    }
+
+    void setLogger( LoggerFactory loggerFactory )
+    {
+        // plexus support
+        setLoggerFactory( loggerFactory );
+    }
+
+    public DefaultArtifactDescriptorReader setRemoteRepositoryManager( RemoteRepositoryManager remoteRepositoryManager )
+    {
+        this.remoteRepositoryManager = Validate.notNull( remoteRepositoryManager,
+            "remoteRepositoryManager cannot be null" );
+        return this;
+    }
+
+    public DefaultArtifactDescriptorReader setVersionResolver( VersionResolver versionResolver )
+    {
+        this.versionResolver = Validate.notNull( versionResolver, "versionResolver cannot be null" );
+        return this;
+    }
+
+    /** @since 3.2.2 */
+    public DefaultArtifactDescriptorReader setVersionRangeResolver( VersionRangeResolver versionRangeResolver )
+    {
+        this.versionRangeResolver = Validate.notNull( versionRangeResolver, "versionRangeResolver cannot be null" );
+        return this;
+    }
+
+    public DefaultArtifactDescriptorReader setArtifactResolver( ArtifactResolver artifactResolver )
+    {
+        this.artifactResolver = Validate.notNull( artifactResolver, "artifactResolver cannot be null" );
+        return this;
+    }
+
+    public DefaultArtifactDescriptorReader setRepositoryEventDispatcher(
+        RepositoryEventDispatcher repositoryEventDispatcher )
+    {
+        this.repositoryEventDispatcher = Validate.notNull( repositoryEventDispatcher,
+            "repositoryEventDispatcher cannot be null" );
+        return this;
+    }
+
+    public DefaultArtifactDescriptorReader setModelBuilder( ModelBuilder modelBuilder )
+    {
+        this.modelBuilder = Validate.notNull( modelBuilder, "modelBuilder cannot be null" );
+        return this;
+    }
+
+    public ArtifactDescriptorResult readArtifactDescriptor( RepositorySystemSession session,
+                                                            ArtifactDescriptorRequest request )
+        throws ArtifactDescriptorException
+    {
+        ArtifactDescriptorResult result = new ArtifactDescriptorResult( request );
+
+        Model model = loadPom( session, request, result );
+        if ( model != null )
+        {
+            Map<String, Object> config = session.getConfigProperties();
+            ArtifactDescriptorReaderDelegate delegate =
+                (ArtifactDescriptorReaderDelegate) config.get( ArtifactDescriptorReaderDelegate.class.getName() );
+
+            if ( delegate == null )
+            {
+                delegate = new ArtifactDescriptorReaderDelegate();
+            }
+
+            delegate.populateResult( session, result, model );
+        }
+
+        return result;
+    }
+
+    private Model loadPom( RepositorySystemSession session, ArtifactDescriptorRequest request,
+                           ArtifactDescriptorResult result )
+        throws ArtifactDescriptorException
+    {
+        RequestTrace trace = RequestTrace.newChild( request.getTrace(), request );
+
+        Set<String> visited = new LinkedHashSet<>();
+        for ( Artifact a = request.getArtifact();; )
+        {
+            Artifact pomArtifact = ArtifactDescriptorUtils.toPomArtifact( a );
+            try
+            {
+                VersionRequest versionRequest =
+                    new VersionRequest( a, request.getRepositories(), request.getRequestContext() );
+                versionRequest.setTrace( trace );
+                VersionResult versionResult = versionResolver.resolveVersion( session, versionRequest );
+
+                a = a.setVersion( versionResult.getVersion() );
+
+                versionRequest =
+                    new VersionRequest( pomArtifact, request.getRepositories(), request.getRequestContext() );
+                versionRequest.setTrace( trace );
+                versionResult = versionResolver.resolveVersion( session, versionRequest );
+
+                pomArtifact = pomArtifact.setVersion( versionResult.getVersion() );
+            }
+            catch ( VersionResolutionException e )
+            {
+                result.addException( e );
+                throw new ArtifactDescriptorException( result );
+            }
+
+            if ( !visited.add( a.getGroupId() + ':' + a.getArtifactId() + ':' + a.getBaseVersion() ) )
+            {
+                RepositoryException exception =
+                    new RepositoryException( "Artifact relocations form a cycle: " + visited );
+                invalidDescriptor( session, trace, a, exception );
+                if ( ( getPolicy( session, a, request ) & ArtifactDescriptorPolicy.IGNORE_INVALID ) != 0 )
+                {
+                    return null;
+                }
+                result.addException( exception );
+                throw new ArtifactDescriptorException( result );
+            }
+
+            ArtifactResult resolveResult;
+            try
+            {
+                ArtifactRequest resolveRequest =
+                    new ArtifactRequest( pomArtifact, request.getRepositories(), request.getRequestContext() );
+                resolveRequest.setTrace( trace );
+                resolveResult = artifactResolver.resolveArtifact( session, resolveRequest );
+                pomArtifact = resolveResult.getArtifact();
+                result.setRepository( resolveResult.getRepository() );
+            }
+            catch ( ArtifactResolutionException e )
+            {
+                if ( e.getCause() instanceof ArtifactNotFoundException )
+                {
+                    missingDescriptor( session, trace, a, (Exception) e.getCause() );
+                    if ( ( getPolicy( session, a, request ) & ArtifactDescriptorPolicy.IGNORE_MISSING ) != 0 )
+                    {
+                        return null;
+                    }
+                }
+                result.addException( e );
+                throw new ArtifactDescriptorException( result );
+            }
+
+            Model model;
+
+            // hack: don't rebuild model if it was already loaded during reactor resolution
+            final WorkspaceReader workspace = session.getWorkspaceReader();
+            if ( workspace instanceof MavenWorkspaceReader )
+            {
+                model = ( (MavenWorkspaceReader) workspace ).findModel( pomArtifact );
+                if ( model != null )
+                {
+                    return model;
+                }
+            }
+
+            try
+            {
+                ModelBuildingRequest modelRequest = new DefaultModelBuildingRequest();
+                modelRequest.setValidationLevel( ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL );
+                modelRequest.setProcessPlugins( false );
+                modelRequest.setTwoPhaseBuilding( false );
+                modelRequest.setSystemProperties( toProperties( session.getUserProperties(),
+                                                                session.getSystemProperties() ) );
+                modelRequest.setModelCache( DefaultModelCache.newInstance( session ) );
+                modelRequest.setModelResolver( new DefaultModelResolver( session, trace.newChild( modelRequest ),
+                                                                         request.getRequestContext(), artifactResolver,
+                                                                         versionRangeResolver, remoteRepositoryManager,
+                                                                         request.getRepositories() ) );
+                if ( resolveResult.getRepository() instanceof WorkspaceRepository )
+                {
+                    modelRequest.setPomFile( pomArtifact.getFile() );
+                }
+                else
+                {
+                    modelRequest.setModelSource( new FileModelSource( pomArtifact.getFile() ) );
+                }
+
+                model = modelBuilder.build( modelRequest ).getEffectiveModel();
+            }
+            catch ( ModelBuildingException e )
+            {
+                for ( ModelProblem problem : e.getProblems() )
+                {
+                    if ( problem.getException() instanceof UnresolvableModelException )
+                    {
+                        result.addException( problem.getException() );
+                        throw new ArtifactDescriptorException( result );
+                    }
+                }
+                invalidDescriptor( session, trace, a, e );
+                if ( ( getPolicy( session, a, request ) & ArtifactDescriptorPolicy.IGNORE_INVALID ) != 0 )
+                {
+                    return null;
+                }
+                result.addException( e );
+                throw new ArtifactDescriptorException( result );
+            }
+
+            Relocation relocation = getRelocation( model );
+
+            if ( relocation != null )
+            {
+                result.addRelocation( a );
+                a =
+                    new RelocatedArtifact( a, relocation.getGroupId(), relocation.getArtifactId(),
+                                           relocation.getVersion() );
+                result.setArtifact( a );
+            }
+            else
+            {
+                return model;
+            }
+        }
+    }
+
+    private Properties toProperties( Map<String, String> dominant, Map<String, String> recessive )
+    {
+        Properties props = new Properties();
+        if ( recessive != null )
+        {
+            props.putAll( recessive );
+        }
+        if ( dominant != null )
+        {
+            props.putAll( dominant );
+        }
+        return props;
+    }
+
+    private Relocation getRelocation( Model model )
+    {
+        Relocation relocation = null;
+        DistributionManagement distMngt = model.getDistributionManagement();
+        if ( distMngt != null )
+        {
+            relocation = distMngt.getRelocation();
+        }
+        return relocation;
+    }
+
+    private void missingDescriptor( RepositorySystemSession session, RequestTrace trace, Artifact artifact,
+                                    Exception exception )
+    {
+        RepositoryEvent.Builder event = new RepositoryEvent.Builder( session, EventType.ARTIFACT_DESCRIPTOR_MISSING );
+        event.setTrace( trace );
+        event.setArtifact( artifact );
+        event.setException( exception );
+
+        repositoryEventDispatcher.dispatch( event.build() );
+    }
+
+    private void invalidDescriptor( RepositorySystemSession session, RequestTrace trace, Artifact artifact,
+                                    Exception exception )
+    {
+        RepositoryEvent.Builder event = new RepositoryEvent.Builder( session, EventType.ARTIFACT_DESCRIPTOR_INVALID );
+        event.setTrace( trace );
+        event.setArtifact( artifact );
+        event.setException( exception );
+
+        repositoryEventDispatcher.dispatch( event.build() );
+    }
+
+    private int getPolicy( RepositorySystemSession session, Artifact a, ArtifactDescriptorRequest request )
+    {
+        ArtifactDescriptorPolicy policy = session.getArtifactDescriptorPolicy();
+        if ( policy == null )
+        {
+            return ArtifactDescriptorPolicy.STRICT;
+        }
+        return policy.getPolicy( session, new ArtifactDescriptorPolicyRequest( a, request.getRequestContext() ) );
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/maven/blob/58554032/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultModelCache.java
----------------------------------------------------------------------
diff --git a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultModelCache.java b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultModelCache.java
new file mode 100644
index 0000000..f13495d
--- /dev/null
+++ b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultModelCache.java
@@ -0,0 +1,119 @@
+package org.apache.maven.repository.internal;
+
+/*
+ * 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.apache.maven.model.building.ModelCache;
+import org.eclipse.aether.RepositoryCache;
+import org.eclipse.aether.RepositorySystemSession;
+
+/**
+ * A model builder cache backed by the repository system cache.
+ *
+ * @author Benjamin Bentmann
+ */
+class DefaultModelCache
+    implements ModelCache
+{
+
+    private final RepositorySystemSession session;
+
+    private final RepositoryCache cache;
+
+    public static ModelCache newInstance( RepositorySystemSession session )
+    {
+        if ( session.getCache() == null )
+        {
+            return null;
+        }
+        else
+        {
+            return new DefaultModelCache( session );
+        }
+    }
+
+    private DefaultModelCache( RepositorySystemSession session )
+    {
+        this.session = session;
+        this.cache = session.getCache();
+    }
+
+    public Object get( String groupId, String artifactId, String version, String tag )
+    {
+        return cache.get( session, new Key( groupId, artifactId, version, tag ) );
+    }
+
+    public void put( String groupId, String artifactId, String version, String tag, Object data )
+    {
+        cache.put( session, new Key( groupId, artifactId, version, tag ), data );
+    }
+
+    static class Key
+    {
+
+        private final String groupId;
+
+        private final String artifactId;
+
+        private final String version;
+
+        private final String tag;
+
+        private final int hash;
+
+        public Key( String groupId, String artifactId, String version, String tag )
+        {
+            this.groupId = groupId;
+            this.artifactId = artifactId;
+            this.version = version;
+            this.tag = tag;
+
+            int h = 17;
+            h = h * 31 + this.groupId.hashCode();
+            h = h * 31 + this.artifactId.hashCode();
+            h = h * 31 + this.version.hashCode();
+            h = h * 31 + this.tag.hashCode();
+            hash = h;
+        }
+
+        @Override
+        public boolean equals( Object obj )
+        {
+            if ( this == obj )
+            {
+                return true;
+            }
+            if ( null == obj || !getClass().equals( obj.getClass() ) )
+            {
+                return false;
+            }
+
+            Key that = (Key) obj;
+            return artifactId.equals( that.artifactId ) && groupId.equals( that.groupId )
+                && version.equals( that.version ) && tag.equals( that.tag );
+        }
+
+        @Override
+        public int hashCode()
+        {
+            return hash;
+        }
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/maven/blob/58554032/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultModelResolver.java
----------------------------------------------------------------------
diff --git a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultModelResolver.java b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultModelResolver.java
new file mode 100644
index 0000000..0832a3a
--- /dev/null
+++ b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultModelResolver.java
@@ -0,0 +1,279 @@
+package org.apache.maven.repository.internal;
+
+/*
+ * 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 java.io.File;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.maven.model.Dependency;
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+import org.apache.maven.model.Parent;
+import org.apache.maven.model.Repository;
+import org.apache.maven.model.building.FileModelSource;
+import org.apache.maven.model.building.ModelSource;
+import org.apache.maven.model.resolution.InvalidRepositoryException;
+import org.apache.maven.model.resolution.ModelResolver;
+import org.apache.maven.model.resolution.UnresolvableModelException;
+import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.RequestTrace;
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.artifact.DefaultArtifact;
+import org.eclipse.aether.impl.ArtifactResolver;
+import org.eclipse.aether.impl.RemoteRepositoryManager;
+import org.eclipse.aether.impl.VersionRangeResolver;
+import org.eclipse.aether.repository.RemoteRepository;
+import org.eclipse.aether.resolution.ArtifactRequest;
+import org.eclipse.aether.resolution.ArtifactResolutionException;
+import org.eclipse.aether.resolution.VersionRangeRequest;
+import org.eclipse.aether.resolution.VersionRangeResolutionException;
+import org.eclipse.aether.resolution.VersionRangeResult;
+
+/**
+ * A model resolver to assist building of dependency POMs. This resolver gives priority to those repositories that have
+ * been initially specified and repositories discovered in dependency POMs are recessively merged into the search chain.
+ *
+ * @author Benjamin Bentmann
+ * @see DefaultArtifactDescriptorReader
+ */
+class DefaultModelResolver
+    implements ModelResolver
+{
+
+    private final RepositorySystemSession session;
+
+    private final RequestTrace trace;
+
+    private final String context;
+
+    private List<RemoteRepository> repositories;
+
+    private final List<RemoteRepository> externalRepositories;
+
+    private final ArtifactResolver resolver;
+
+    private final VersionRangeResolver versionRangeResolver;
+
+    private final RemoteRepositoryManager remoteRepositoryManager;
+
+    private final Set<String> repositoryIds;
+
+    public DefaultModelResolver( RepositorySystemSession session, RequestTrace trace, String context,
+                                 ArtifactResolver resolver, VersionRangeResolver versionRangeResolver,
+                                 RemoteRepositoryManager remoteRepositoryManager, List<RemoteRepository> repositories )
+    {
+        this.session = session;
+        this.trace = trace;
+        this.context = context;
+        this.resolver = resolver;
+        this.versionRangeResolver = versionRangeResolver;
+        this.remoteRepositoryManager = remoteRepositoryManager;
+        this.repositories = repositories;
+        List<RemoteRepository> externalRepositories = new ArrayList<>();
+        externalRepositories.addAll( repositories );
+        this.externalRepositories = Collections.unmodifiableList( externalRepositories );
+
+        this.repositoryIds = new HashSet<>();
+    }
+
+    private DefaultModelResolver( DefaultModelResolver original )
+    {
+        this.session = original.session;
+        this.trace = original.trace;
+        this.context = original.context;
+        this.resolver = original.resolver;
+        this.versionRangeResolver = original.versionRangeResolver;
+        this.remoteRepositoryManager = original.remoteRepositoryManager;
+        this.repositories = new ArrayList<>( original.repositories );
+        this.externalRepositories = original.externalRepositories;
+        this.repositoryIds = new HashSet<>( original.repositoryIds );
+    }
+
+    @Override
+    public void addRepository( Repository repository )
+        throws InvalidRepositoryException
+    {
+        addRepository( repository, false );
+    }
+
+    @Override
+    public void addRepository( final Repository repository, boolean replace )
+        throws InvalidRepositoryException
+    {
+        if ( session.isIgnoreArtifactDescriptorRepositories() )
+        {
+            return;
+        }
+
+        if ( !repositoryIds.add( repository.getId() ) )
+        {
+            if ( !replace )
+            {
+                return;
+            }
+
+            removeMatchingRepository( repositories, repository.getId() );
+        }
+
+        List<RemoteRepository> newRepositories =
+            Collections.singletonList( ArtifactDescriptorUtils.toRemoteRepository( repository ) );
+
+        this.repositories =
+            remoteRepositoryManager.aggregateRepositories( session, repositories, newRepositories, true );
+    }
+
+    private static void removeMatchingRepository( Iterable<RemoteRepository> repositories, final String id )
+    {
+        Iterables.removeIf( repositories, new Predicate<RemoteRepository>()
+        {
+            @Override
+            public boolean apply( RemoteRepository remoteRepository )
+            {
+                return remoteRepository.getId().equals( id );
+            }
+        } );
+    }
+
+    @Override
+    public ModelResolver newCopy()
+    {
+        return new DefaultModelResolver( this );
+    }
+
+    @Override
+    public ModelSource resolveModel( String groupId, String artifactId, String version )
+        throws UnresolvableModelException
+    {
+        Artifact pomArtifact = new DefaultArtifact( groupId, artifactId, "", "pom", version );
+
+        try
+        {
+            ArtifactRequest request = new ArtifactRequest( pomArtifact, repositories, context );
+            request.setTrace( trace );
+            pomArtifact = resolver.resolveArtifact( session, request ).getArtifact();
+        }
+        catch ( ArtifactResolutionException e )
+        {
+            throw new UnresolvableModelException( e.getMessage(), groupId, artifactId, version, e );
+        }
+
+        File pomFile = pomArtifact.getFile();
+
+        return new FileModelSource( pomFile );
+    }
+
+    @Override
+    public ModelSource resolveModel( final Parent parent )
+        throws UnresolvableModelException
+    {
+        try
+        {
+            final Artifact artifact = new DefaultArtifact( parent.getGroupId(), parent.getArtifactId(), "", "pom",
+                                                           parent.getVersion() );
+
+            final VersionRangeRequest versionRangeRequest = new VersionRangeRequest( artifact, repositories, context );
+            versionRangeRequest.setTrace( trace );
+
+            final VersionRangeResult versionRangeResult =
+                versionRangeResolver.resolveVersionRange( session, versionRangeRequest );
+
+            if ( versionRangeResult.getHighestVersion() == null )
+            {
+                throw new UnresolvableModelException(
+                    String.format( "No versions matched the requested parent version range '%s'",
+                                   parent.getVersion() ),
+                    parent.getGroupId(), parent.getArtifactId(), parent.getVersion() );
+
+            }
+
+            if ( versionRangeResult.getVersionConstraint() != null
+                     && versionRangeResult.getVersionConstraint().getRange() != null
+                     && versionRangeResult.getVersionConstraint().getRange().getUpperBound() == null )
+            {
+                throw new UnresolvableModelException(
+                    String.format( "The requested parent version range '%s' does not specify an upper bound",
+                                   parent.getVersion() ),
+                    parent.getGroupId(), parent.getArtifactId(), parent.getVersion() );
+
+            }
+
+            parent.setVersion( versionRangeResult.getHighestVersion().toString() );
+
+            return resolveModel( parent.getGroupId(), parent.getArtifactId(), parent.getVersion() );
+        }
+        catch ( final VersionRangeResolutionException e )
+        {
+            throw new UnresolvableModelException( e.getMessage(), parent.getGroupId(), parent.getArtifactId(),
+                                                  parent.getVersion(), e );
+
+        }
+    }
+
+    @Override
+    public ModelSource resolveModel( final Dependency dependency )
+        throws UnresolvableModelException
+    {
+        try
+        {
+            final Artifact artifact = new DefaultArtifact( dependency.getGroupId(), dependency.getArtifactId(), "",
+                                                           "pom", dependency.getVersion() );
+
+            final VersionRangeRequest versionRangeRequest = new VersionRangeRequest( artifact, repositories, context );
+            versionRangeRequest.setTrace( trace );
+
+            final VersionRangeResult versionRangeResult =
+                versionRangeResolver.resolveVersionRange( session, versionRangeRequest );
+
+            if ( versionRangeResult.getHighestVersion() == null )
+            {
+                throw new UnresolvableModelException(
+                    String.format( "No versions matched the requested dependency version range '%s'",
+                                   dependency.getVersion() ),
+                    dependency.getGroupId(), dependency.getArtifactId(), dependency.getVersion() );
+
+            }
+
+            if ( versionRangeResult.getVersionConstraint() != null
+                     && versionRangeResult.getVersionConstraint().getRange() != null
+                     && versionRangeResult.getVersionConstraint().getRange().getUpperBound() == null )
+            {
+                throw new UnresolvableModelException(
+                    String.format( "The requested dependency version range '%s' does not specify an upper bound",
+                                   dependency.getVersion() ),
+                    dependency.getGroupId(), dependency.getArtifactId(), dependency.getVersion() );
+
+            }
+
+            dependency.setVersion( versionRangeResult.getHighestVersion().toString() );
+
+            return resolveModel( dependency.getGroupId(), dependency.getArtifactId(), dependency.getVersion() );
+        }
+        catch ( VersionRangeResolutionException e )
+        {
+            throw new UnresolvableModelException( e.getMessage(), dependency.getGroupId(), dependency.getArtifactId(),
+                                                  dependency.getVersion(), e );
+
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/maven/blob/58554032/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultVersionRangeResolver.java
----------------------------------------------------------------------
diff --git a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultVersionRangeResolver.java b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultVersionRangeResolver.java
new file mode 100644
index 0000000..8e53c74
--- /dev/null
+++ b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultVersionRangeResolver.java
@@ -0,0 +1,327 @@
+package org.apache.maven.repository.internal;
+
+/*
+ * 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.apache.commons.lang3.Validate;
+import org.apache.maven.artifact.repository.metadata.Versioning;
+import org.apache.maven.artifact.repository.metadata.io.xpp3.MetadataXpp3Reader;
+import org.codehaus.plexus.component.annotations.Component;
+import org.codehaus.plexus.component.annotations.Requirement;
+import org.eclipse.aether.RepositoryEvent;
+import org.eclipse.aether.RepositoryEvent.EventType;
+import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.RequestTrace;
+import org.eclipse.aether.SyncContext;
+import org.eclipse.aether.impl.MetadataResolver;
+import org.eclipse.aether.impl.RepositoryEventDispatcher;
+import org.eclipse.aether.impl.SyncContextFactory;
+import org.eclipse.aether.impl.VersionRangeResolver;
+import org.eclipse.aether.metadata.DefaultMetadata;
+import org.eclipse.aether.metadata.Metadata;
+import org.eclipse.aether.repository.ArtifactRepository;
+import org.eclipse.aether.repository.RemoteRepository;
+import org.eclipse.aether.repository.WorkspaceReader;
+import org.eclipse.aether.resolution.MetadataRequest;
+import org.eclipse.aether.resolution.MetadataResult;
+import org.eclipse.aether.resolution.VersionRangeRequest;
+import org.eclipse.aether.resolution.VersionRangeResolutionException;
+import org.eclipse.aether.resolution.VersionRangeResult;
+import org.eclipse.aether.spi.locator.Service;
+import org.eclipse.aether.spi.locator.ServiceLocator;
+import org.eclipse.aether.spi.log.Logger;
+import org.eclipse.aether.spi.log.LoggerFactory;
+import org.eclipse.aether.spi.log.NullLoggerFactory;
+import org.eclipse.aether.util.version.GenericVersionScheme;
+import org.eclipse.aether.version.InvalidVersionSpecificationException;
+import org.eclipse.aether.version.Version;
+import org.eclipse.aether.version.VersionConstraint;
+import org.eclipse.aether.version.VersionScheme;
+import org.eclipse.sisu.Nullable;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Benjamin Bentmann
+ */
+@Named
+@Singleton
+@Component( role = VersionRangeResolver.class, hint = "default" )
+public class DefaultVersionRangeResolver
+    implements VersionRangeResolver, Service
+{
+
+    private static final String MAVEN_METADATA_XML = "maven-metadata.xml";
+
+    @SuppressWarnings( "unused" )
+    @Requirement( role = LoggerFactory.class )
+    private Logger logger = NullLoggerFactory.LOGGER;
+
+    @Requirement
+    private MetadataResolver metadataResolver;
+
+    @Requirement
+    private SyncContextFactory syncContextFactory;
+
+    @Requirement
+    private RepositoryEventDispatcher repositoryEventDispatcher;
+
+    @Requirement( role = VersionRangeResultFilter.class, optional = true )
+    private VersionRangeResultFilter versionRangeResultFilter = new DefaultVersionRangeResultFilter();
+
+    public DefaultVersionRangeResolver()
+    {
+        // enable default constructor
+    }
+
+    @Inject
+    DefaultVersionRangeResolver( MetadataResolver metadataResolver, SyncContextFactory syncContextFactory,
+                                 RepositoryEventDispatcher repositoryEventDispatcher, LoggerFactory loggerFactory,
+                                 @Nullable VersionRangeResultFilter versionRangeResultFilter )
+    {
+        setMetadataResolver( metadataResolver );
+        setSyncContextFactory( syncContextFactory );
+        setLoggerFactory( loggerFactory );
+        setRepositoryEventDispatcher( repositoryEventDispatcher );
+        if ( versionRangeResultFilter != null )
+        {
+            setVersionRangeResultFilter( versionRangeResultFilter );
+        }
+    }
+
+    public void initService( ServiceLocator locator )
+    {
+        setLoggerFactory( locator.getService( LoggerFactory.class ) );
+        setMetadataResolver( locator.getService( MetadataResolver.class ) );
+        setSyncContextFactory( locator.getService( SyncContextFactory.class ) );
+        setRepositoryEventDispatcher( locator.getService( RepositoryEventDispatcher.class ) );
+        final VersionRangeResultFilter versionRangeResultFilter = locator.getService( VersionRangeResultFilter.class );
+        if ( versionRangeResultFilter != null )
+        {
+            setVersionRangeResultFilter( versionRangeResultFilter );
+        }
+    }
+
+    public DefaultVersionRangeResolver setLoggerFactory( LoggerFactory loggerFactory )
+    {
+        this.logger = NullLoggerFactory.getSafeLogger( loggerFactory, getClass() );
+        return this;
+    }
+
+    void setLogger( LoggerFactory loggerFactory )
+    {
+        // plexus support
+        setLoggerFactory( loggerFactory );
+    }
+
+    public DefaultVersionRangeResolver setMetadataResolver( MetadataResolver metadataResolver )
+    {
+        this.metadataResolver = Validate.notNull( metadataResolver, "metadataResolver cannot be null" );
+        return this;
+    }
+
+    public DefaultVersionRangeResolver setSyncContextFactory( SyncContextFactory syncContextFactory )
+    {
+        this.syncContextFactory = Validate.notNull( syncContextFactory, "syncContextFactory cannot be null" );
+        return this;
+    }
+
+    public DefaultVersionRangeResolver setRepositoryEventDispatcher(
+        RepositoryEventDispatcher repositoryEventDispatcher )
+    {
+        this.repositoryEventDispatcher = Validate.notNull( repositoryEventDispatcher,
+            "repositoryEventDispatcher cannot be null" );
+        return this;
+    }
+
+    public DefaultVersionRangeResolver setVersionRangeResultFilter( VersionRangeResultFilter versionRangeResultFilter )
+    {
+        this.versionRangeResultFilter = Validate.notNull( versionRangeResultFilter,
+                "versionRangeResultFilter cannot be null" );
+        return this;
+    }
+
+    public VersionRangeResult resolveVersionRange( RepositorySystemSession session, VersionRangeRequest request )
+        throws VersionRangeResolutionException
+    {
+        VersionRangeResult result = new VersionRangeResult( request );
+
+        VersionScheme versionScheme = new GenericVersionScheme();
+
+        VersionConstraint versionConstraint;
+        try
+        {
+            versionConstraint = versionScheme.parseVersionConstraint( request.getArtifact().getVersion() );
+        }
+        catch ( InvalidVersionSpecificationException e )
+        {
+            result.addException( e );
+            throw new VersionRangeResolutionException( result );
+        }
+
+        result.setVersionConstraint( versionConstraint );
+
+        if ( versionConstraint.getRange() == null )
+        {
+            result.addVersion( versionConstraint.getVersion() );
+        }
+        else
+        {
+            Map<String, ArtifactRepository> versionIndex = getVersions( session, result, request );
+
+            List<Version> versions = new ArrayList<>();
+            for ( Map.Entry<String, ArtifactRepository> v : versionIndex.entrySet() )
+            {
+                try
+                {
+                    Version ver = versionScheme.parseVersion( v.getKey() );
+                    if ( versionConstraint.containsVersion( ver ) )
+                    {
+                        versions.add( ver );
+                        result.setRepository( ver, v.getValue() );
+                    }
+                }
+                catch ( InvalidVersionSpecificationException e )
+                {
+                    result.addException( e );
+                }
+            }
+
+            Collections.sort( versions );
+            result.setVersions( versions );
+        }
+
+        return versionRangeResultFilter.filterVersionRangeResult( result );
+    }
+
+    private Map<String, ArtifactRepository> getVersions( RepositorySystemSession session, VersionRangeResult result,
+                                                         VersionRangeRequest request )
+    {
+        RequestTrace trace = RequestTrace.newChild( request.getTrace(), request );
+
+        Map<String, ArtifactRepository> versionIndex = new HashMap<>();
+
+        Metadata metadata =
+            new DefaultMetadata( request.getArtifact().getGroupId(), request.getArtifact().getArtifactId(),
+                                 MAVEN_METADATA_XML, Metadata.Nature.RELEASE_OR_SNAPSHOT );
+
+        List<MetadataRequest> metadataRequests = new ArrayList<>( request.getRepositories().size() );
+
+        metadataRequests.add( new MetadataRequest( metadata, null, request.getRequestContext() ) );
+
+        for ( RemoteRepository repository : request.getRepositories() )
+        {
+            MetadataRequest metadataRequest = new MetadataRequest( metadata, repository, request.getRequestContext() );
+            metadataRequest.setDeleteLocalCopyIfMissing( true );
+            metadataRequest.setTrace( trace );
+            metadataRequests.add( metadataRequest );
+        }
+
+        List<MetadataResult> metadataResults = metadataResolver.resolveMetadata( session, metadataRequests );
+
+        WorkspaceReader workspace = session.getWorkspaceReader();
+        if ( workspace != null )
+        {
+            List<String> versions = workspace.findVersions( request.getArtifact() );
+            for ( String version : versions )
+            {
+                versionIndex.put( version, workspace.getRepository() );
+            }
+        }
+
+        for ( MetadataResult metadataResult : metadataResults )
+        {
+            result.addException( metadataResult.getException() );
+
+            ArtifactRepository repository = metadataResult.getRequest().getRepository();
+            if ( repository == null )
+            {
+                repository = session.getLocalRepository();
+            }
+
+            Versioning versioning = readVersions( session, trace, metadataResult.getMetadata(), repository, result );
+            for ( String version : versioning.getVersions() )
+            {
+                if ( !versionIndex.containsKey( version ) )
+                {
+                    versionIndex.put( version, repository );
+                }
+            }
+        }
+
+        return versionIndex;
+    }
+
+    private Versioning readVersions( RepositorySystemSession session, RequestTrace trace, Metadata metadata,
+                                     ArtifactRepository repository, VersionRangeResult result )
+    {
+        Versioning versioning = null;
+
+        try
+        {
+            if ( metadata != null )
+            {
+                try ( SyncContext syncContext = syncContextFactory.newInstance( session, true ) )
+                {
+                    syncContext.acquire( null, Collections.singleton( metadata ) );
+
+                    if ( metadata.getFile() != null && metadata.getFile().exists() )
+                    {
+                        try ( InputStream in = new FileInputStream( metadata.getFile() ) )
+                        {
+                            org.apache.maven.artifact.repository.metadata.Metadata m =
+                                new MetadataXpp3Reader().read( in, false );
+
+                            versioning = m.getVersioning();
+                        }
+                    }
+                }
+            }
+        }
+        catch ( Exception e )
+        {
+            invalidMetadata( session, trace, metadata, repository, e );
+            result.addException( e );
+        }
+
+        return ( versioning != null ) ? versioning : new Versioning();
+    }
+
+    private void invalidMetadata( RepositorySystemSession session, RequestTrace trace, Metadata metadata,
+                                  ArtifactRepository repository, Exception exception )
+    {
+        RepositoryEvent.Builder event = new RepositoryEvent.Builder( session, EventType.METADATA_INVALID );
+        event.setTrace( trace );
+        event.setMetadata( metadata );
+        event.setException( exception );
+        event.setRepository( repository );
+
+        repositoryEventDispatcher.dispatch( event.build() );
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/maven/blob/58554032/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultVersionRangeResultFilter.java
----------------------------------------------------------------------
diff --git a/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultVersionRangeResultFilter.java b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultVersionRangeResultFilter.java
new file mode 100644
index 0000000..5ecaf8f
--- /dev/null
+++ b/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultVersionRangeResultFilter.java
@@ -0,0 +1,45 @@
+package org.apache.maven.repository.internal;
+
+/*
+ * 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.eclipse.aether.resolution.VersionRangeResolutionException;
+import org.eclipse.aether.resolution.VersionRangeResult;
+
+/**
+ * Non filtering implementation of {@link VersionRangeResultFilter}.
+ *
+ * <p>
+ * This implementation reflects the Apache Maven default version range handling and don't filter anything out of
+ * {@link VersionRangeResult}.
+ * </p>
+ *
+ * @author barthel
+ * @since 3.4.0
+ */
+public class DefaultVersionRangeResultFilter implements VersionRangeResultFilter
+{
+
+    @Override
+    public VersionRangeResult filterVersionRangeResult( VersionRangeResult versionRangeResult )
+            throws VersionRangeResolutionException
+    {
+        return versionRangeResult;
+    }
+}


Re: extensions.xml (Re: [4/7] maven git commit: [MNG-6110] Upgrade Aether to Maven Resolver 1.2)

Posted by Igor Fedorenko <ig...@ifedorenko.com>.
The list of exported artifacts appears to be correct. It effectively
removes listed artifacts from plugin realms and forces plugins to use
classes exported from core realm. 

We obviously need to do this org.eclipse.aether artifacts to avoid
multiple versions of the same classes present both in maven core and in
plugin realm.

I don't remember why we need to filter org.sonatype.aether, but that
aether version cannot be used with maven core, so at very least the
filter will  force earlier ClassNotFoundError, which I believe is
useful.

[1] http://takari.io/book/91-maven-classloading.html

-- 
Regards,
Igor

On Sun, Dec 11, 2016, at 05:41 PM, Christian Schulte wrote:
> Can someone please take a look at this and verify the changes are
> correct? I am not sure the former artifacts also need to be exported.
> For the sonatype ones the package names are different. For the eclipse
> ones the package names are identical. Not sure, though.
> 
> <exportedArtifact>org.eclipse.aether:aether-api</exportedArtifact>
> <exportedArtifact>org.eclipse.aether:aether-spi</exportedArtifact>
> <exportedArtifact>org.eclipse.aether:aether-impl</exportedArtifact>
> 
> 
> Am 12/11/16 um 23:37 schrieb schulte@apache.org:
> > http://git-wip-us.apache.org/repos/asf/maven/blob/58554032/maven-core/src/main/resources/META-INF/maven/extension.xml
> > ----------------------------------------------------------------------
> > diff --git a/maven-core/src/main/resources/META-INF/maven/extension.xml b/maven-core/src/main/resources/META-INF/maven/extension.xml
> > index eaa807b..55e0096 100644
> > --- a/maven-core/src/main/resources/META-INF/maven/extension.xml
> > +++ b/maven-core/src/main/resources/META-INF/maven/extension.xml
> > @@ -54,7 +54,7 @@ under the License.
> >      <exportedPackage>org.apache.maven.wagon.repository</exportedPackage>
> >      <exportedPackage>org.apache.maven.wagon.resource</exportedPackage>
> >  
> > -    <!-- aether-api, aether-spi, aether-impl -->
> > +    <!-- maven-resolver-api, maven-resolver-spi, maven-resolver-impl -->
> >      <exportedPackage>org.eclipse.aether.*</exportedPackage>
> >      <exportedPackage>org.eclipse.aether.artifact</exportedPackage>
> >      <exportedPackage>org.eclipse.aether.collection</exportedPackage>
> > @@ -134,7 +134,7 @@ under the License.
> >      <exportedArtifact>org.sonatype.sisu:sisu-inject-plexus</exportedArtifact>
> >      <exportedArtifact>org.eclipse.sisu:org.eclipse.sisu.plexus</exportedArtifact>
> >      <exportedArtifact>org.apache.maven:maven-artifact</exportedArtifact>
> > -    <exportedArtifact>org.apache.maven:maven-aether-provider</exportedArtifact>
> > +    <exportedArtifact>org.apache.maven:maven-resolver-provider</exportedArtifact>
> >      <exportedArtifact>org.apache.maven:maven-artifact-manager</exportedArtifact>
> >      <exportedArtifact>org.apache.maven:maven-compat</exportedArtifact>
> >      <exportedArtifact>org.apache.maven:maven-core</exportedArtifact>
> > @@ -154,9 +154,9 @@ under the License.
> >      <exportedArtifact>org.apache.maven:maven-settings-builder</exportedArtifact>
> >      <exportedArtifact>org.apache.maven:maven-toolchain</exportedArtifact>
> >      <exportedArtifact>org.apache.maven.wagon:wagon-provider-api</exportedArtifact>
> > -    <exportedArtifact>org.eclipse.aether:aether-api</exportedArtifact>
> > -    <exportedArtifact>org.eclipse.aether:aether-spi</exportedArtifact>
> > -    <exportedArtifact>org.eclipse.aether:aether-impl</exportedArtifact>
> > +    <exportedArtifact>org.apache.maven.resolver:maven-resolver-api</exportedArtifact>
> > +    <exportedArtifact>org.apache.maven.resolver:maven-resolver-spi</exportedArtifact>
> > +    <exportedArtifact>org.apache.maven.resolver:maven-resolver-impl</exportedArtifact>
> >  
> >      <exportedArtifact>javax.inject:javax.inject</exportedArtifact>
> >      <exportedArtifact>javax.annotation:jsr250-api</exportedArtifact>
> > @@ -169,6 +169,9 @@ under the License.
> >      <exportedArtifact>org.sonatype.aether:aether-api</exportedArtifact>
> >      <exportedArtifact>org.sonatype.aether:aether-spi</exportedArtifact>
> >      <exportedArtifact>org.sonatype.aether:aether-impl</exportedArtifact>
> > +    <exportedArtifact>org.eclipse.aether:aether-api</exportedArtifact>
> > +    <exportedArtifact>org.eclipse.aether:aether-spi</exportedArtifact>
> > +    <exportedArtifact>org.eclipse.aether:aether-impl</exportedArtifact>
> >  
> >      <!--
> >        | NOTE: Don't exclude the wagons or any of their dependencies (apart from the wagon API). This would otherwise
> > 
> 
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
> For additional commands, e-mail: dev-help@maven.apache.org
> 

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
For additional commands, e-mail: dev-help@maven.apache.org


extensions.xml (Re: [4/7] maven git commit: [MNG-6110] Upgrade Aether to Maven Resolver 1.2)

Posted by Christian Schulte <cs...@schulte.it>.
Can someone please take a look at this and verify the changes are
correct? I am not sure the former artifacts also need to be exported.
For the sonatype ones the package names are different. For the eclipse
ones the package names are identical. Not sure, though.

<exportedArtifact>org.eclipse.aether:aether-api</exportedArtifact>
<exportedArtifact>org.eclipse.aether:aether-spi</exportedArtifact>
<exportedArtifact>org.eclipse.aether:aether-impl</exportedArtifact>


Am 12/11/16 um 23:37 schrieb schulte@apache.org:
> http://git-wip-us.apache.org/repos/asf/maven/blob/58554032/maven-core/src/main/resources/META-INF/maven/extension.xml
> ----------------------------------------------------------------------
> diff --git a/maven-core/src/main/resources/META-INF/maven/extension.xml b/maven-core/src/main/resources/META-INF/maven/extension.xml
> index eaa807b..55e0096 100644
> --- a/maven-core/src/main/resources/META-INF/maven/extension.xml
> +++ b/maven-core/src/main/resources/META-INF/maven/extension.xml
> @@ -54,7 +54,7 @@ under the License.
>      <exportedPackage>org.apache.maven.wagon.repository</exportedPackage>
>      <exportedPackage>org.apache.maven.wagon.resource</exportedPackage>
>  
> -    <!-- aether-api, aether-spi, aether-impl -->
> +    <!-- maven-resolver-api, maven-resolver-spi, maven-resolver-impl -->
>      <exportedPackage>org.eclipse.aether.*</exportedPackage>
>      <exportedPackage>org.eclipse.aether.artifact</exportedPackage>
>      <exportedPackage>org.eclipse.aether.collection</exportedPackage>
> @@ -134,7 +134,7 @@ under the License.
>      <exportedArtifact>org.sonatype.sisu:sisu-inject-plexus</exportedArtifact>
>      <exportedArtifact>org.eclipse.sisu:org.eclipse.sisu.plexus</exportedArtifact>
>      <exportedArtifact>org.apache.maven:maven-artifact</exportedArtifact>
> -    <exportedArtifact>org.apache.maven:maven-aether-provider</exportedArtifact>
> +    <exportedArtifact>org.apache.maven:maven-resolver-provider</exportedArtifact>
>      <exportedArtifact>org.apache.maven:maven-artifact-manager</exportedArtifact>
>      <exportedArtifact>org.apache.maven:maven-compat</exportedArtifact>
>      <exportedArtifact>org.apache.maven:maven-core</exportedArtifact>
> @@ -154,9 +154,9 @@ under the License.
>      <exportedArtifact>org.apache.maven:maven-settings-builder</exportedArtifact>
>      <exportedArtifact>org.apache.maven:maven-toolchain</exportedArtifact>
>      <exportedArtifact>org.apache.maven.wagon:wagon-provider-api</exportedArtifact>
> -    <exportedArtifact>org.eclipse.aether:aether-api</exportedArtifact>
> -    <exportedArtifact>org.eclipse.aether:aether-spi</exportedArtifact>
> -    <exportedArtifact>org.eclipse.aether:aether-impl</exportedArtifact>
> +    <exportedArtifact>org.apache.maven.resolver:maven-resolver-api</exportedArtifact>
> +    <exportedArtifact>org.apache.maven.resolver:maven-resolver-spi</exportedArtifact>
> +    <exportedArtifact>org.apache.maven.resolver:maven-resolver-impl</exportedArtifact>
>  
>      <exportedArtifact>javax.inject:javax.inject</exportedArtifact>
>      <exportedArtifact>javax.annotation:jsr250-api</exportedArtifact>
> @@ -169,6 +169,9 @@ under the License.
>      <exportedArtifact>org.sonatype.aether:aether-api</exportedArtifact>
>      <exportedArtifact>org.sonatype.aether:aether-spi</exportedArtifact>
>      <exportedArtifact>org.sonatype.aether:aether-impl</exportedArtifact>
> +    <exportedArtifact>org.eclipse.aether:aether-api</exportedArtifact>
> +    <exportedArtifact>org.eclipse.aether:aether-spi</exportedArtifact>
> +    <exportedArtifact>org.eclipse.aether:aether-impl</exportedArtifact>
>  
>      <!--
>        | NOTE: Don't exclude the wagons or any of their dependencies (apart from the wagon API). This would otherwise
> 



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
For additional commands, e-mail: dev-help@maven.apache.org