You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by hb...@apache.org on 2016/09/15 21:10:51 UTC

[4/7] maven-resolver git commit: MNG-6007 renamed package to Maven Artifact Resolver

http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/b5f1ab9c/src/main/java/org/apache/maven/resolver/internal/ant/AntRepoSys.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/maven/resolver/internal/ant/AntRepoSys.java b/src/main/java/org/apache/maven/resolver/internal/ant/AntRepoSys.java
new file mode 100644
index 0000000..3b158e4
--- /dev/null
+++ b/src/main/java/org/apache/maven/resolver/internal/ant/AntRepoSys.java
@@ -0,0 +1,825 @@
+package org.apache.maven.resolver.internal.ant;
+
+/*
+ * 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.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Properties;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.apache.maven.model.Model;
+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.resolution.ModelResolver;
+import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
+import org.apache.maven.resolver.internal.ant.types.Artifact;
+import org.apache.maven.resolver.internal.ant.types.Artifacts;
+import org.apache.maven.resolver.internal.ant.types.Authentication;
+import org.apache.maven.resolver.internal.ant.types.Dependencies;
+import org.apache.maven.resolver.internal.ant.types.Dependency;
+import org.apache.maven.resolver.internal.ant.types.DependencyContainer;
+import org.apache.maven.resolver.internal.ant.types.Exclusion;
+import org.apache.maven.resolver.internal.ant.types.LocalRepository;
+import org.apache.maven.resolver.internal.ant.types.Mirror;
+import org.apache.maven.resolver.internal.ant.types.Pom;
+import org.apache.maven.resolver.internal.ant.types.Proxy;
+import org.apache.maven.resolver.internal.ant.types.RemoteRepositories;
+import org.apache.maven.resolver.internal.ant.types.RemoteRepository;
+import org.apache.maven.settings.Server;
+import org.apache.maven.settings.Settings;
+import org.apache.maven.settings.building.DefaultSettingsBuilderFactory;
+import org.apache.maven.settings.building.DefaultSettingsBuildingRequest;
+import org.apache.maven.settings.building.SettingsBuilder;
+import org.apache.maven.settings.building.SettingsBuildingException;
+import org.apache.maven.settings.crypto.DefaultSettingsDecryptionRequest;
+import org.apache.maven.settings.crypto.SettingsDecrypter;
+import org.apache.maven.settings.crypto.SettingsDecryptionResult;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.taskdefs.condition.Os;
+import org.apache.tools.ant.types.Reference;
+import org.codehaus.plexus.util.xml.Xpp3Dom;
+import org.eclipse.aether.ConfigurationProperties;
+import org.eclipse.aether.DefaultRepositoryCache;
+import org.eclipse.aether.DefaultRepositorySystemSession;
+import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.RepositorySystemSession;
+import org.eclipse.aether.artifact.DefaultArtifact;
+import org.eclipse.aether.collection.CollectRequest;
+import org.eclipse.aether.collection.CollectResult;
+import org.eclipse.aether.collection.DependencyCollectionException;
+import org.eclipse.aether.connector.basic.BasicRepositoryConnectorFactory;
+import org.eclipse.aether.deployment.DeployRequest;
+import org.eclipse.aether.deployment.DeploymentException;
+import org.eclipse.aether.impl.DefaultServiceLocator;
+import org.eclipse.aether.impl.RemoteRepositoryManager;
+import org.eclipse.aether.installation.InstallRequest;
+import org.eclipse.aether.installation.InstallationException;
+import org.eclipse.aether.repository.AuthenticationSelector;
+import org.eclipse.aether.repository.LocalRepositoryManager;
+import org.eclipse.aether.repository.MirrorSelector;
+import org.eclipse.aether.repository.ProxySelector;
+import org.eclipse.aether.spi.connector.RepositoryConnectorFactory;
+import org.eclipse.aether.spi.connector.transport.TransporterFactory;
+import org.eclipse.aether.spi.log.Logger;
+import org.eclipse.aether.transport.classpath.ClasspathTransporterFactory;
+import org.eclipse.aether.transport.file.FileTransporterFactory;
+import org.eclipse.aether.transport.http.HttpTransporterFactory;
+import org.eclipse.aether.util.repository.AuthenticationBuilder;
+import org.eclipse.aether.util.repository.ConservativeAuthenticationSelector;
+import org.eclipse.aether.util.repository.DefaultAuthenticationSelector;
+import org.eclipse.aether.util.repository.DefaultMirrorSelector;
+import org.eclipse.aether.util.repository.DefaultProxySelector;
+
+/**
+ */
+public class AntRepoSys
+{
+
+    private static final boolean OS_WINDOWS = Os.isFamily( "windows" );
+
+    private static final ModelBuilder MODEL_BUILDER = new DefaultModelBuilderFactory().newInstance();
+
+    private static final SettingsBuilder SETTINGS_BUILDER = new DefaultSettingsBuilderFactory().newInstance();
+
+    private static final SettingsDecrypter SETTINGS_DECRYPTER = new AntSettingsDecryptorFactory().newInstance();
+
+    private final Project project;
+
+    private final DefaultServiceLocator locator;
+
+    private RepositorySystem repoSys;
+
+    private RemoteRepositoryManager remoteRepoMan;
+
+    private File userSettings;
+
+    private File globalSettings;
+
+    private Settings settings;
+
+    private final List<Mirror> mirrors = new CopyOnWriteArrayList<Mirror>();
+
+    private final List<Proxy> proxies = new CopyOnWriteArrayList<Proxy>();
+
+    private final List<Authentication> authentications = new CopyOnWriteArrayList<Authentication>();
+
+    private LocalRepository localRepository;
+
+    private Pom defaultPom;
+
+    private static <T> boolean eq( T o1, T o2 )
+    {
+        return ( o1 == null ) ? o2 == null : o1.equals( o2 );
+    }
+
+    public static synchronized AntRepoSys getInstance( Project project )
+    {
+        Object obj = project.getReference( Names.ID );
+        if ( obj instanceof AntRepoSys )
+        {
+            return (AntRepoSys) obj;
+        }
+        AntRepoSys instance = new AntRepoSys( project );
+        project.addReference( Names.ID, instance );
+        instance.initDefaults();
+        return instance;
+    }
+
+    private AntRepoSys( Project project )
+    {
+        this.project = project;
+
+        locator = MavenRepositorySystemUtils.newServiceLocator();
+        locator.setErrorHandler( new AntServiceLocatorErrorHandler( project ) );
+        locator.setServices( Logger.class, new AntLogger( project ) );
+        locator.setServices( ModelBuilder.class, MODEL_BUILDER );
+        locator.addService( RepositoryConnectorFactory.class, BasicRepositoryConnectorFactory.class );
+        locator.addService( TransporterFactory.class, FileTransporterFactory.class );
+        locator.addService( TransporterFactory.class, HttpTransporterFactory.class );
+        locator.addService( TransporterFactory.class, ClasspathTransporterFactory.class );
+    }
+
+    private void initDefaults()
+    {
+        RemoteRepository repo = new RemoteRepository();
+        repo.setProject( project );
+        repo.setId( "central" );
+        repo.setUrl( "http://repo1.maven.org/maven2/" );
+        project.addReference( Names.ID_CENTRAL, repo );
+
+        repo = new RemoteRepository();
+        repo.setProject( project );
+        repo.setRefid( new Reference( project, Names.ID_CENTRAL ) );
+        RemoteRepositories repos = new RemoteRepositories();
+        repos.setProject( project );
+        repos.addRemoterepo( repo );
+        project.addReference( Names.ID_DEFAULT_REPOS, repos );
+    }
+
+    public synchronized RepositorySystem getSystem()
+    {
+        if ( repoSys == null )
+        {
+            repoSys = locator.getService( RepositorySystem.class );
+            if ( repoSys == null )
+            {
+                throw new BuildException( "The repository system could not be initialized" );
+            }
+        }
+        return repoSys;
+    }
+
+    private synchronized RemoteRepositoryManager getRemoteRepoMan()
+    {
+        if ( remoteRepoMan == null )
+        {
+            remoteRepoMan = locator.getService( RemoteRepositoryManager.class );
+            if ( remoteRepoMan == null )
+            {
+                throw new BuildException( "The repository system could not be initialized" );
+            }
+        }
+        return remoteRepoMan;
+    }
+
+    public RepositorySystemSession getSession( Task task, LocalRepository localRepo )
+    {
+        DefaultRepositorySystemSession session = MavenRepositorySystemUtils.newSession();
+
+        Map<Object, Object> configProps = new LinkedHashMap<Object, Object>();
+        configProps.put( ConfigurationProperties.USER_AGENT, getUserAgent() );
+        configProps.putAll( (Map<?, ?>) project.getProperties() );
+        processServerConfiguration( configProps );
+        session.setConfigProperties( configProps );
+
+        session.setOffline( isOffline() );
+        session.setUserProperties( project.getUserProperties() );
+
+        session.setProxySelector( getProxySelector() );
+        session.setMirrorSelector( getMirrorSelector() );
+        session.setAuthenticationSelector( getAuthSelector() );
+
+        session.setCache( new DefaultRepositoryCache() );
+
+        session.setRepositoryListener( new AntRepositoryListener( task ) );
+        session.setTransferListener( new AntTransferListener( task ) );
+
+        session.setLocalRepositoryManager( getLocalRepoMan( session, localRepo ) );
+
+        session.setWorkspaceReader( ProjectWorkspaceReader.getInstance() );
+
+        return session;
+    }
+
+    private String getUserAgent()
+    {
+        StringBuilder buffer = new StringBuilder( 128 );
+
+        buffer.append( "Apache-Ant/" ).append( project.getProperty( "ant.version" ) );
+        buffer.append( " (" );
+        buffer.append( "Java " ).append( System.getProperty( "java.version" ) );
+        buffer.append( "; " );
+        buffer.append( System.getProperty( "os.name" ) ).append( " " ).append( System.getProperty( "os.version" ) );
+        buffer.append( ")" );
+        buffer.append( " Aether" );
+
+        return buffer.toString();
+    }
+
+    private boolean isOffline()
+    {
+        String prop = project.getProperty( Names.PROPERTY_OFFLINE );
+        if ( prop != null )
+        {
+            return Boolean.parseBoolean( prop );
+        }
+        return getSettings().isOffline();
+    }
+
+    private void processServerConfiguration( Map<Object, Object> configProps )
+    {
+        Settings settings = getSettings();
+        for ( Server server : settings.getServers() )
+        {
+            if ( server.getConfiguration() != null )
+            {
+                Xpp3Dom dom = (Xpp3Dom) server.getConfiguration();
+                for ( int i = dom.getChildCount() - 1; i >= 0; i-- )
+                {
+                    Xpp3Dom child = dom.getChild( i );
+                    if ( "wagonProvider".equals( child.getName() ) )
+                    {
+                        dom.removeChild( i );
+                    }
+                    else if ( "httpHeaders".equals( child.getName() ) )
+                    {
+                        configProps.put( ConfigurationProperties.HTTP_HEADERS + "." + server.getId(),
+                                         getHttpHeaders( child ) );
+                    }
+                }
+
+                configProps.put( "aether.connector.wagon.config." + server.getId(), dom );
+            }
+
+            configProps.put( "aether.connector.perms.fileMode." + server.getId(), server.getFilePermissions() );
+            configProps.put( "aether.connector.perms.dirMode." + server.getId(), server.getDirectoryPermissions() );
+        }
+    }
+
+    private Map<String, String> getHttpHeaders( Xpp3Dom dom )
+    {
+        Map<String, String> headers = new HashMap<String, String>();
+        for ( int i = 0; i < dom.getChildCount(); i++ )
+        {
+            Xpp3Dom child = dom.getChild( i );
+            Xpp3Dom name = child.getChild( "name" );
+            Xpp3Dom value = child.getChild( "value" );
+            if ( name != null && name.getValue() != null )
+            {
+                headers.put( name.getValue(), ( value != null ) ? value.getValue() : null );
+            }
+        }
+        return Collections.unmodifiableMap( headers );
+    }
+
+    private File getDefaultLocalRepoDir()
+    {
+        String dir = project.getProperty( "maven.repo.local" );
+        if ( dir != null )
+        {
+            return project.resolveFile( dir );
+        }
+
+        Settings settings = getSettings();
+        if ( settings.getLocalRepository() != null )
+        {
+            return new File( settings.getLocalRepository() );
+        }
+
+        return new File( new File( project.getProperty( "user.home" ), ".m2" ), "repository" );
+    }
+
+    private LocalRepositoryManager getLocalRepoMan( RepositorySystemSession session, LocalRepository localRepo )
+    {
+        if ( localRepo == null )
+        {
+            localRepo = localRepository;
+        }
+
+        File repoDir;
+        if ( localRepo != null && localRepo.getDir() != null )
+        {
+            repoDir = localRepo.getDir();
+        }
+        else
+        {
+            repoDir = getDefaultLocalRepoDir();
+        }
+
+        org.eclipse.aether.repository.LocalRepository repo =
+            new org.eclipse.aether.repository.LocalRepository( repoDir );
+
+        return getSystem().newLocalRepositoryManager( session, repo );
+    }
+
+    private synchronized Settings getSettings()
+    {
+        if ( settings == null )
+        {
+            DefaultSettingsBuildingRequest request = new DefaultSettingsBuildingRequest();
+            request.setUserSettingsFile( getUserSettings() );
+            request.setGlobalSettingsFile( getGlobalSettings() );
+            request.setSystemProperties( getSystemProperties() );
+            request.setUserProperties( getUserProperties() );
+
+            try
+            {
+                settings = SETTINGS_BUILDER.build( request ).getEffectiveSettings();
+            }
+            catch ( SettingsBuildingException e )
+            {
+                project.log( "Could not process settings.xml: " + e.getMessage(), e, Project.MSG_WARN );
+            }
+
+            SettingsDecryptionResult result =
+                SETTINGS_DECRYPTER.decrypt( new DefaultSettingsDecryptionRequest( settings ) );
+            settings.setServers( result.getServers() );
+            settings.setProxies( result.getProxies() );
+        }
+        return settings;
+    }
+
+    private ProxySelector getProxySelector()
+    {
+        DefaultProxySelector selector = new DefaultProxySelector();
+
+        for ( Proxy proxy : proxies )
+        {
+            selector.add( ConverterUtils.toProxy( proxy ), proxy.getNonProxyHosts() );
+        }
+
+        Settings settings = getSettings();
+        for ( org.apache.maven.settings.Proxy proxy : settings.getProxies() )
+        {
+            AuthenticationBuilder auth = new AuthenticationBuilder();
+            auth.addUsername( proxy.getUsername() ).addPassword( proxy.getPassword() );
+            selector.add( new org.eclipse.aether.repository.Proxy( proxy.getProtocol(), proxy.getHost(),
+                                                                   proxy.getPort(), auth.build() ),
+                          proxy.getNonProxyHosts() );
+        }
+
+        return selector;
+    }
+
+    private MirrorSelector getMirrorSelector()
+    {
+        DefaultMirrorSelector selector = new DefaultMirrorSelector();
+
+        for ( Mirror mirror : mirrors )
+        {
+            selector.add( mirror.getId(), mirror.getUrl(), mirror.getType(), false, mirror.getMirrorOf(), null );
+        }
+
+        Settings settings = getSettings();
+        for ( org.apache.maven.settings.Mirror mirror : settings.getMirrors() )
+        {
+            selector.add( String.valueOf( mirror.getId() ), mirror.getUrl(), mirror.getLayout(), false,
+                          mirror.getMirrorOf(), mirror.getMirrorOfLayouts() );
+        }
+
+        return selector;
+    }
+
+    private AuthenticationSelector getAuthSelector()
+    {
+        DefaultAuthenticationSelector selector = new DefaultAuthenticationSelector();
+
+        Collection<String> ids = new HashSet<String>();
+        for ( Authentication auth : authentications )
+        {
+            List<String> servers = auth.getServers();
+            if ( !servers.isEmpty() )
+            {
+                org.eclipse.aether.repository.Authentication a = ConverterUtils.toAuthentication( auth );
+                for ( String server : servers )
+                {
+                    if ( ids.add( server ) )
+                    {
+                        selector.add( server, a );
+                    }
+                }
+            }
+        }
+
+        Settings settings = getSettings();
+        for ( Server server : settings.getServers() )
+        {
+            AuthenticationBuilder auth = new AuthenticationBuilder();
+            auth.addUsername( server.getUsername() ).addPassword( server.getPassword() );
+            auth.addPrivateKey( server.getPrivateKey(), server.getPassphrase() );
+            selector.add( server.getId(), auth.build() );
+        }
+
+        return new ConservativeAuthenticationSelector( selector );
+    }
+
+    public synchronized void setUserSettings( File file )
+    {
+        if ( !eq( this.userSettings, file ) )
+        {
+            settings = null;
+        }
+        this.userSettings = file;
+    }
+
+    /* UT */File getUserSettings()
+    {
+        if ( userSettings == null )
+        {
+            userSettings = AetherUtils.findUserSettings( project );
+        }
+        return userSettings;
+    }
+
+    public void setGlobalSettings( File file )
+    {
+        if ( !eq( this.globalSettings, file ) )
+        {
+            settings = null;
+        }
+        this.globalSettings = file;
+    }
+
+    /* UT */File getGlobalSettings()
+    {
+        if ( globalSettings == null )
+        {
+            globalSettings = AetherUtils.findGlobalSettings( project );
+        }
+        return globalSettings;
+    }
+
+    public void addProxy( Proxy proxy )
+    {
+        proxies.add( proxy );
+    }
+
+    public void addMirror( Mirror mirror )
+    {
+        mirrors.add( mirror );
+    }
+
+    public void addAuthentication( Authentication authentication )
+    {
+        authentications.add( authentication );
+    }
+
+    public void setLocalRepository( LocalRepository localRepository )
+    {
+        this.localRepository = localRepository;
+    }
+
+    public Model loadModel( Task task, File pomFile, boolean local, RemoteRepositories remoteRepositories )
+    {
+        RepositorySystemSession session = getSession( task, null );
+
+        remoteRepositories =
+            remoteRepositories == null ? AetherUtils.getDefaultRepositories( project ) : remoteRepositories;
+
+        List<org.eclipse.aether.repository.RemoteRepository> repositories =
+            ConverterUtils.toRepositories( task.getProject(), session, remoteRepositories, getRemoteRepoMan() );
+
+        ModelResolver modelResolver =
+            new AntModelResolver( session, "project", getSystem(), getRemoteRepoMan(), repositories );
+
+        Settings settings = getSettings();
+
+        try
+        {
+            DefaultModelBuildingRequest request = new DefaultModelBuildingRequest();
+            request.setLocationTracking( true );
+            request.setProcessPlugins( false );
+            if ( local )
+            {
+                request.setPomFile( pomFile );
+                request.setValidationLevel( ModelBuildingRequest.VALIDATION_LEVEL_STRICT );
+            }
+            else
+            {
+                request.setModelSource( new FileModelSource( pomFile ) );
+                request.setValidationLevel( ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL );
+            }
+            request.setSystemProperties( getSystemProperties() );
+            request.setUserProperties( getUserProperties() );
+            request.setProfiles( SettingsUtils.convert( settings.getProfiles() ) );
+            request.setActiveProfileIds( settings.getActiveProfiles() );
+            request.setModelResolver( modelResolver );
+            return MODEL_BUILDER.build( request ).getEffectiveModel();
+        }
+        catch ( ModelBuildingException e )
+        {
+            throw new BuildException( "Could not load POM " + pomFile + ": " + e.getMessage(), e );
+        }
+    }
+
+    private Properties getSystemProperties()
+    {
+        Properties props = new Properties();
+        getEnvProperties( props );
+        props.putAll( System.getProperties() );
+        ConverterUtils.addProperties( props, project.getProperties() );
+        return props;
+    }
+
+    private Properties getEnvProperties( Properties props )
+    {
+        if ( props == null )
+        {
+            props = new Properties();
+        }
+        boolean envCaseInsensitive = OS_WINDOWS;
+        for ( Map.Entry<String, String> entry : System.getenv().entrySet() )
+        {
+            String key = entry.getKey();
+            if ( envCaseInsensitive )
+            {
+                key = key.toUpperCase( Locale.ENGLISH );
+            }
+            key = "env." + key;
+            props.put( key, entry.getValue() );
+        }
+        return props;
+    }
+
+    private Properties getUserProperties()
+    {
+        return ConverterUtils.addProperties( null, project.getUserProperties() );
+    }
+
+    /**
+     * Sets the default POM.
+     */
+    public void setDefaultPom( Pom pom )
+    {
+        this.defaultPom = pom;
+    }
+
+    /**
+     * Returns the current default POM.
+     */
+    public Pom getDefaultPom()
+    {
+        return defaultPom;
+    }
+
+    public CollectResult collectDependencies( Task task, Dependencies dependencies, LocalRepository localRepository,
+                                              RemoteRepositories remoteRepositories )
+    {
+        RepositorySystemSession session = getSession( task, localRepository );
+
+        remoteRepositories =
+            remoteRepositories == null ? AetherUtils.getDefaultRepositories( project ) : remoteRepositories;
+
+        List<org.eclipse.aether.repository.RemoteRepository> repos =
+            ConverterUtils.toRepositories( project, session, remoteRepositories, getRemoteRepoMan() );
+
+        CollectRequest collectRequest = new CollectRequest();
+        collectRequest.setRequestContext( "project" );
+
+        for ( org.eclipse.aether.repository.RemoteRepository repo : repos )
+        {
+            task.getProject().log( "Using remote repository " + repo, Project.MSG_VERBOSE );
+            collectRequest.addRepository( repo );
+        }
+
+        if ( dependencies != null )
+        {
+            populateCollectRequest( collectRequest, task, session, dependencies, Collections.<Exclusion>emptyList() );
+        }
+
+        task.getProject().log( "Collecting dependencies", Project.MSG_VERBOSE );
+
+        CollectResult result;
+        try
+        {
+            result = getSystem().collectDependencies( session, collectRequest );
+        }
+        catch ( DependencyCollectionException e )
+        {
+            throw new BuildException( "Could not collect dependencies: " + e.getMessage(), e );
+        }
+
+        return result;
+    }
+
+    private void populateCollectRequest( CollectRequest collectRequest, Task task, RepositorySystemSession session,
+                                         Dependencies dependencies, List<Exclusion> exclusions )
+    {
+        List<Exclusion> globalExclusions = exclusions;
+        if ( !dependencies.getExclusions().isEmpty() )
+        {
+            globalExclusions = new ArrayList<Exclusion>( exclusions );
+            globalExclusions.addAll( dependencies.getExclusions() );
+        }
+
+        Collection<String> ids = new HashSet<String>();
+
+        for ( DependencyContainer container : dependencies.getDependencyContainers() )
+        {
+            if ( container instanceof Dependency )
+            {
+                Dependency dep = (Dependency) container;
+                ids.add( dep.getVersionlessKey() );
+                collectRequest.addDependency( ConverterUtils.toDependency( dep, globalExclusions, session ) );
+            }
+            else
+            {
+                populateCollectRequest( collectRequest, task, session, (Dependencies) container, globalExclusions );
+            }
+        }
+
+        if ( dependencies.getPom() != null )
+        {
+            Model model = dependencies.getPom().getModel( task );
+            for ( org.apache.maven.model.Dependency dep : model.getDependencies() )
+            {
+                Dependency dependency = new Dependency();
+                dependency.setArtifactId( dep.getArtifactId() );
+                dependency.setClassifier( dep.getClassifier() );
+                dependency.setGroupId( dep.getGroupId() );
+                dependency.setScope( dep.getScope() );
+                dependency.setType( dep.getType() );
+                dependency.setVersion( dep.getVersion() );
+                if ( ids.contains( dependency.getVersionlessKey() ) )
+                {
+                    project.log( "Ignoring dependency " + dependency.getVersionlessKey() + " from " + model.getId()
+                        + ", already declared locally", Project.MSG_VERBOSE );
+                    continue;
+                }
+                if ( dep.getSystemPath() != null && dep.getSystemPath().length() > 0 )
+                {
+                    dependency.setSystemPath( task.getProject().resolveFile( dep.getSystemPath() ) );
+                }
+                for ( org.apache.maven.model.Exclusion exc : dep.getExclusions() )
+                {
+                    Exclusion exclusion = new Exclusion();
+                    exclusion.setGroupId( exc.getGroupId() );
+                    exclusion.setArtifactId( exc.getArtifactId() );
+                    exclusion.setClassifier( "*" );
+                    exclusion.setExtension( "*" );
+                    dependency.addExclusion( exclusion );
+                }
+                collectRequest.addDependency( ConverterUtils.toDependency( dependency, globalExclusions, session ) );
+            }
+        }
+
+        if ( dependencies.getFile() != null )
+        {
+            List<Dependency> deps = readDependencies( dependencies.getFile() );
+            for ( Dependency dependency : deps )
+            {
+                if ( ids.contains( dependency.getVersionlessKey() ) )
+                {
+                    project.log( "Ignoring dependency " + dependency.getVersionlessKey() + " from "
+                                     + dependencies.getFile() + ", already declared locally", Project.MSG_VERBOSE );
+                    continue;
+                }
+                collectRequest.addDependency( ConverterUtils.toDependency( dependency, globalExclusions, session ) );
+            }
+        }
+    }
+
+    private List<Dependency> readDependencies( File file )
+    {
+        List<Dependency> dependencies = new ArrayList<Dependency>();
+        try
+        {
+            BufferedReader reader = new BufferedReader( new InputStreamReader( new FileInputStream( file ), "UTF-8" ) );
+            try
+            {
+                for ( String line = reader.readLine(); line != null; line = reader.readLine() )
+                {
+                    int comment = line.indexOf( '#' );
+                    if ( comment >= 0 )
+                    {
+                        line = line.substring( 0, comment );
+                    }
+                    line = line.trim();
+                    if ( line.length() <= 0 )
+                    {
+                        continue;
+                    }
+                    Dependency dependency = new Dependency();
+                    dependency.setCoords( line );
+                    dependencies.add( dependency );
+                }
+            }
+            finally
+            {
+                reader.close();
+            }
+        }
+        catch ( IOException e )
+        {
+            throw new BuildException( "Cannot read " + file, e );
+        }
+        return dependencies;
+    }
+
+    public void install( Task task, Pom pom, Artifacts artifacts )
+    {
+        RepositorySystemSession session = getSession( task, null );
+
+        InstallRequest request = new InstallRequest();
+        request.setArtifacts( toArtifacts( task, session, pom, artifacts ) );
+
+        try
+        {
+            getSystem().install( session, request );
+        }
+        catch ( InstallationException e )
+        {
+            throw new BuildException( "Could not install artifacts: " + e.getMessage(), e );
+        }
+    }
+
+    public void deploy( Task task, Pom pom, Artifacts artifacts, RemoteRepository releaseRepository,
+                        RemoteRepository snapshotRepository )
+    {
+        RepositorySystemSession session = getSession( task, null );
+
+        DeployRequest request = new DeployRequest();
+        request.setArtifacts( toArtifacts( task, session, pom, artifacts ) );
+        boolean snapshot = request.getArtifacts().iterator().next().isSnapshot();
+        RemoteRepository distRepo = ( snapshot && snapshotRepository != null ) ? snapshotRepository : releaseRepository;
+        request.setRepository( ConverterUtils.toDistRepository( distRepo, session ) );
+
+        try
+        {
+            getSystem().deploy( session, request );
+        }
+        catch ( DeploymentException e )
+        {
+            throw new BuildException( "Could not deploy artifacts: " + e.getMessage(), e );
+        }
+    }
+
+    private List<org.eclipse.aether.artifact.Artifact> toArtifacts( Task task, RepositorySystemSession session,
+                                                                    Pom pom, Artifacts artifacts )
+    {
+        Model model = pom.getModel( task );
+        File pomFile = pom.getFile();
+
+        List<org.eclipse.aether.artifact.Artifact> results = new ArrayList<org.eclipse.aether.artifact.Artifact>();
+
+        org.eclipse.aether.artifact.Artifact pomArtifact =
+            new DefaultArtifact( model.getGroupId(), model.getArtifactId(), "pom", model.getVersion() ).setFile( pomFile );
+        results.add( pomArtifact );
+
+        for ( Artifact artifact : artifacts.getArtifacts() )
+        {
+            org.eclipse.aether.artifact.Artifact buildArtifact =
+                new DefaultArtifact( model.getGroupId(), model.getArtifactId(), artifact.getClassifier(),
+                                     artifact.getType(), model.getVersion() ).setFile( artifact.getFile() );
+            results.add( buildArtifact );
+        }
+
+        return results;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/b5f1ab9c/src/main/java/org/apache/maven/resolver/internal/ant/AntRepositoryListener.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/maven/resolver/internal/ant/AntRepositoryListener.java b/src/main/java/org/apache/maven/resolver/internal/ant/AntRepositoryListener.java
new file mode 100644
index 0000000..f850357
--- /dev/null
+++ b/src/main/java/org/apache/maven/resolver/internal/ant/AntRepositoryListener.java
@@ -0,0 +1,123 @@
+package org.apache.maven.resolver.internal.ant;
+
+/*
+ * 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.FileNotFoundException;
+
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.eclipse.aether.AbstractRepositoryListener;
+import org.eclipse.aether.RepositoryEvent;
+import org.eclipse.aether.transfer.MetadataNotFoundException;
+
+/**
+ * Logs repository events like installed and unresolved artifacts and metadata.
+ */
+class AntRepositoryListener
+    extends AbstractRepositoryListener
+{
+
+    private Task task;
+
+    public AntRepositoryListener( Task task )
+    {
+        this.task = task;
+    }
+
+    @Override
+    public void artifactInstalling( RepositoryEvent event )
+    {
+        task.log( "Installing " + event.getArtifact().getFile() + " to " + event.getFile() );
+    }
+
+    @Override
+    public void metadataInstalling( RepositoryEvent event )
+    {
+        task.log( "Installing " + event.getMetadata() + " to " + event.getFile() );
+    }
+
+    @Override
+    public void metadataResolved( RepositoryEvent event )
+    {
+        Exception e = event.getException();
+        if ( e != null )
+        {
+            if ( e instanceof MetadataNotFoundException )
+            {
+                task.log( e.getMessage(), Project.MSG_DEBUG );
+            }
+            else
+            {
+                task.log( e.getMessage(), e, Project.MSG_WARN );
+            }
+        }
+    }
+
+    @Override
+    public void metadataInvalid( RepositoryEvent event )
+    {
+        Exception exception = event.getException();
+
+        StringBuilder buffer = new StringBuilder( 256 );
+        buffer.append( "The metadata " );
+        if ( event.getMetadata().getFile() != null )
+        {
+            buffer.append( event.getMetadata().getFile() );
+        }
+        else
+        {
+            buffer.append( event.getMetadata() );
+        }
+
+        if ( exception instanceof FileNotFoundException )
+        {
+            buffer.append( " is inaccessible" );
+        }
+        else
+        {
+            buffer.append( " is invalid" );
+        }
+
+        if ( exception != null )
+        {
+            buffer.append( ": " );
+            buffer.append( exception.getMessage() );
+        }
+
+        task.log( buffer.toString(), exception, Project.MSG_WARN );
+    }
+
+    @Override
+    public void artifactDescriptorInvalid( RepositoryEvent event )
+    {
+        task.log( "The POM for " + event.getArtifact() + " is invalid"
+                      + ", transitive dependencies (if any) will not be available: "
+                      + event.getException().getMessage(),
+                  event.getException(), Project.MSG_WARN );
+    };
+
+    @Override
+    public void artifactDescriptorMissing( RepositoryEvent event )
+    {
+        task.log( "The POM for " + event.getArtifact() + " is missing, no dependency information available",
+                  Project.MSG_WARN );
+    };
+
+}

http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/b5f1ab9c/src/main/java/org/apache/maven/resolver/internal/ant/AntSecDispatcher.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/maven/resolver/internal/ant/AntSecDispatcher.java b/src/main/java/org/apache/maven/resolver/internal/ant/AntSecDispatcher.java
new file mode 100644
index 0000000..0852f86
--- /dev/null
+++ b/src/main/java/org/apache/maven/resolver/internal/ant/AntSecDispatcher.java
@@ -0,0 +1,45 @@
+package org.apache.maven.resolver.internal.ant;
+
+/*
+ * 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.sonatype.plexus.components.cipher.DefaultPlexusCipher;
+import org.sonatype.plexus.components.cipher.PlexusCipherException;
+import org.sonatype.plexus.components.sec.dispatcher.DefaultSecDispatcher;
+
+/**
+ */
+class AntSecDispatcher
+    extends DefaultSecDispatcher
+{
+
+    public AntSecDispatcher()
+    {
+        _configurationFile = "~/.m2/settings-security.xml";
+        try
+        {
+            _cipher = new DefaultPlexusCipher();
+        }
+        catch ( PlexusCipherException e )
+        {
+            e.printStackTrace();
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/b5f1ab9c/src/main/java/org/apache/maven/resolver/internal/ant/AntServiceLocatorErrorHandler.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/maven/resolver/internal/ant/AntServiceLocatorErrorHandler.java b/src/main/java/org/apache/maven/resolver/internal/ant/AntServiceLocatorErrorHandler.java
new file mode 100644
index 0000000..1621285
--- /dev/null
+++ b/src/main/java/org/apache/maven/resolver/internal/ant/AntServiceLocatorErrorHandler.java
@@ -0,0 +1,50 @@
+package org.apache.maven.resolver.internal.ant;
+
+/*
+ * 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.tools.ant.Project;
+import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.impl.DefaultServiceLocator;
+
+/**
+ */
+class AntServiceLocatorErrorHandler
+    extends DefaultServiceLocator.ErrorHandler
+{
+
+    private Project project;
+
+    public AntServiceLocatorErrorHandler( Project project )
+    {
+        this.project = project;
+    }
+
+    public void serviceCreationFailed( Class<?> type, Class<?> impl, Throwable exception )
+    {
+        String msg = "Could not initialize repository system";
+        if ( !RepositorySystem.class.equals( type ) )
+        {
+            msg += ", service " + type.getName() + " (" + impl.getName() + ") failed to initialize";
+        }
+        msg += ": " + exception.getMessage();
+        project.log( msg, exception, Project.MSG_ERR );
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/b5f1ab9c/src/main/java/org/apache/maven/resolver/internal/ant/AntSettingsDecryptorFactory.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/maven/resolver/internal/ant/AntSettingsDecryptorFactory.java b/src/main/java/org/apache/maven/resolver/internal/ant/AntSettingsDecryptorFactory.java
new file mode 100644
index 0000000..39ef960
--- /dev/null
+++ b/src/main/java/org/apache/maven/resolver/internal/ant/AntSettingsDecryptorFactory.java
@@ -0,0 +1,51 @@
+package org.apache.maven.resolver.internal.ant;
+
+/*
+ * 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.lang.reflect.Field;
+
+import org.apache.maven.settings.crypto.DefaultSettingsDecrypter;
+
+/**
+ */
+class AntSettingsDecryptorFactory
+{
+
+    public DefaultSettingsDecrypter newInstance()
+    {
+        AntSecDispatcher secDispatcher = new AntSecDispatcher();
+
+        DefaultSettingsDecrypter decrypter = new DefaultSettingsDecrypter();
+
+        try
+        {
+            Field field = decrypter.getClass().getDeclaredField( "securityDispatcher" );
+            field.setAccessible( true );
+            field.set( decrypter, secDispatcher );
+        }
+        catch ( Exception e )
+        {
+            throw new IllegalStateException( e );
+        }
+
+        return decrypter;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/b5f1ab9c/src/main/java/org/apache/maven/resolver/internal/ant/AntTransferListener.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/maven/resolver/internal/ant/AntTransferListener.java b/src/main/java/org/apache/maven/resolver/internal/ant/AntTransferListener.java
new file mode 100644
index 0000000..6844d22
--- /dev/null
+++ b/src/main/java/org/apache/maven/resolver/internal/ant/AntTransferListener.java
@@ -0,0 +1,91 @@
+package org.apache.maven.resolver.internal.ant;
+
+/*
+ * 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.text.DecimalFormat;
+import java.text.DecimalFormatSymbols;
+import java.util.Locale;
+
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.eclipse.aether.transfer.AbstractTransferListener;
+import org.eclipse.aether.transfer.TransferCancelledException;
+import org.eclipse.aether.transfer.TransferEvent;
+import org.eclipse.aether.transfer.TransferResource;
+
+/**
+ * Logs up- and downloads.
+ */
+class AntTransferListener
+    extends AbstractTransferListener
+{
+
+    private Task task;
+
+    public AntTransferListener( Task task )
+    {
+        this.task = task;
+    }
+
+    @Override
+    public void transferInitiated( TransferEvent event )
+        throws TransferCancelledException
+    {
+        String msg = event.getRequestType() == TransferEvent.RequestType.PUT ? "Uploading" : "Downloading";
+        msg += " " + event.getResource().getRepositoryUrl() + event.getResource().getResourceName();
+        task.log( msg );
+    }
+
+    @Override
+    public void transferCorrupted( TransferEvent event )
+        throws TransferCancelledException
+    {
+        TransferResource resource = event.getResource();
+
+        task.log( event.getException().getMessage() + " for " + resource.getRepositoryUrl()
+                      + resource.getResourceName(), Project.MSG_WARN );
+    }
+
+    @Override
+    public void transferSucceeded( TransferEvent event )
+    {
+        String msg = event.getRequestType() == TransferEvent.RequestType.PUT ? "Uploaded" : "Downloaded";
+        msg += " " + event.getResource().getRepositoryUrl() + event.getResource().getResourceName();
+
+        long contentLength = event.getTransferredBytes();
+        if ( contentLength >= 0 )
+        {
+            String len = contentLength >= 1024 ? ( ( contentLength + 1023 ) / 1024 ) + " KB" : contentLength + " B";
+
+            String throughput = "";
+            long duration = System.currentTimeMillis() - event.getResource().getTransferStartTime();
+            if ( duration > 0 )
+            {
+                DecimalFormat format = new DecimalFormat( "0.0", new DecimalFormatSymbols( Locale.ENGLISH ) );
+                double kbPerSec = ( contentLength / 1024.0 ) / ( duration / 1000.0 );
+                throughput = " at " + format.format( kbPerSec ) + " KB/sec";
+            }
+
+            msg += " (" + len + throughput + ")";
+        }
+        task.log( msg );
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/b5f1ab9c/src/main/java/org/apache/maven/resolver/internal/ant/ConverterUtils.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/maven/resolver/internal/ant/ConverterUtils.java b/src/main/java/org/apache/maven/resolver/internal/ant/ConverterUtils.java
new file mode 100644
index 0000000..6452ec1
--- /dev/null
+++ b/src/main/java/org/apache/maven/resolver/internal/ant/ConverterUtils.java
@@ -0,0 +1,227 @@
+package org.apache.maven.resolver.internal.ant;
+
+/*
+ * 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.Collection;
+import java.util.Collections;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import org.apache.maven.resolver.internal.ant.types.Authentication;
+import org.apache.maven.resolver.internal.ant.types.Dependency;
+import org.apache.maven.resolver.internal.ant.types.Exclusion;
+import org.apache.maven.resolver.internal.ant.types.Proxy;
+import org.apache.maven.resolver.internal.ant.types.RemoteRepositories;
+import org.apache.maven.resolver.internal.ant.types.RemoteRepository;
+import org.apache.tools.ant.Project;
+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.impl.RemoteRepositoryManager;
+import org.eclipse.aether.repository.RepositoryPolicy;
+import org.eclipse.aether.util.repository.AuthenticationBuilder;
+
+/**
+ * Utility methods to convert between Aether and Ant objects.
+ */
+class ConverterUtils
+{
+
+    private static org.eclipse.aether.artifact.Artifact toArtifact( Dependency dependency, ArtifactTypeRegistry types )
+    {
+        ArtifactType type = types.get( dependency.getType() );
+        if ( type == null )
+        {
+            type = new DefaultArtifactType( dependency.getType() );
+        }
+
+        Map<String, String> props = null;
+        if ( "system".equals( dependency.getScope() ) && dependency.getSystemPath() != null )
+        {
+            props = Collections.singletonMap( ArtifactProperties.LOCAL_PATH, dependency.getSystemPath().getPath() );
+        }
+
+        Artifact artifact =
+            new DefaultArtifact( dependency.getGroupId(), dependency.getArtifactId(), dependency.getClassifier(), null,
+                                 dependency.getVersion(), props, type );
+
+        return artifact;
+    }
+
+    public static org.eclipse.aether.repository.Authentication toAuthentication( Authentication auth )
+    {
+        if ( auth == null )
+        {
+            return null;
+        }
+        AuthenticationBuilder authBuilder = new AuthenticationBuilder();
+        authBuilder.addUsername( auth.getUsername() ).addPassword( auth.getPassword() );
+        authBuilder.addPrivateKey( auth.getPrivateKeyFile(), auth.getPassphrase() );
+        return authBuilder.build();
+    }
+
+    public static org.eclipse.aether.graph.Dependency toDependency( Dependency dependency, List<Exclusion> exclusions,
+                                                                     RepositorySystemSession session )
+    {
+        return new org.eclipse.aether.graph.Dependency( toArtifact( dependency, session.getArtifactTypeRegistry() ),
+                                                         dependency.getScope(), false,
+                                                         toExclusions( dependency.getExclusions(), exclusions ) );
+    }
+
+    /**
+     * Converts the given ant repository type to an Aether repository instance with authentication and proxy filled in
+     * via the sessions' selectors.
+     */
+    public static org.eclipse.aether.repository.RemoteRepository toDistRepository( RemoteRepository repo,
+                                                                       RepositorySystemSession session )
+    {
+        org.eclipse.aether.repository.RemoteRepository result = toRepository( repo );
+        org.eclipse.aether.repository.RemoteRepository.Builder builder =
+            new org.eclipse.aether.repository.RemoteRepository.Builder( result );
+        builder.setAuthentication( session.getAuthenticationSelector().getAuthentication( result ) );
+        builder.setProxy( session.getProxySelector().getProxy( result ) );
+        return builder.build();
+    }
+
+    private static org.eclipse.aether.graph.Exclusion toExclusion( Exclusion exclusion )
+    {
+        return new org.eclipse.aether.graph.Exclusion( exclusion.getGroupId(), exclusion.getArtifactId(),
+                                                        exclusion.getClassifier(), exclusion.getExtension() );
+    }
+
+    private static Collection<org.eclipse.aether.graph.Exclusion> toExclusions( Collection<Exclusion> exclusions1,
+                                                                                 Collection<Exclusion> exclusions2 )
+    {
+        Collection<org.eclipse.aether.graph.Exclusion> results =
+            new LinkedHashSet<org.eclipse.aether.graph.Exclusion>();
+        if ( exclusions1 != null )
+        {
+            for ( Exclusion exclusion : exclusions1 )
+            {
+                results.add( toExclusion( exclusion ) );
+            }
+        }
+        if ( exclusions2 != null )
+        {
+            for ( Exclusion exclusion : exclusions2 )
+            {
+                results.add( toExclusion( exclusion ) );
+            }
+        }
+        return results;
+    }
+
+    private static RepositoryPolicy toPolicy( RemoteRepository.Policy policy, boolean enabled, String updates,
+                                              String checksums )
+    {
+        if ( policy != null )
+        {
+            enabled = policy.isEnabled();
+            if ( policy.getChecksums() != null )
+            {
+                checksums = policy.getChecksums();
+            }
+            if ( policy.getUpdates() != null )
+            {
+                updates = policy.getUpdates();
+            }
+        }
+        return new RepositoryPolicy( enabled, updates, checksums );
+    }
+
+    /**
+     * Adds every &lt;String, String>-entry in the map as a property to the given Properties.
+     */
+    public static Properties addProperties( Properties props, Map<?, ?> map )
+    {
+        if ( props == null )
+        {
+            props = new Properties();
+        }
+        for ( Map.Entry<?, ?> entry : map.entrySet() )
+        {
+            if ( entry.getKey() instanceof String && entry.getValue() instanceof String )
+            {
+                props.put( entry.getKey(), entry.getValue() );
+            }
+        }
+        return props;
+    }
+
+    public static org.eclipse.aether.repository.Proxy toProxy( Proxy proxy )
+    {
+        if ( proxy == null )
+        {
+            return null;
+        }
+        return new org.eclipse.aether.repository.Proxy( proxy.getType(), proxy.getHost(), proxy.getPort(),
+                                                         toAuthentication( proxy.getAuthentication() ) );
+    }
+
+    private static org.eclipse.aether.repository.RemoteRepository toRepository( RemoteRepository repo )
+    {
+        org.eclipse.aether.repository.RemoteRepository.Builder builder =
+            new org.eclipse.aether.repository.RemoteRepository.Builder( repo.getId(), repo.getType(), repo.getUrl() );
+        builder.setSnapshotPolicy( toPolicy( repo.getSnapshotPolicy(), repo.isSnapshots(), repo.getUpdates(),
+                                             repo.getChecksums() ) );
+        builder.setReleasePolicy( toPolicy( repo.getReleasePolicy(), repo.isReleases(), repo.getUpdates(),
+                                            repo.getChecksums() ) );
+        builder.setAuthentication( toAuthentication( repo.getAuthentication() ) );
+        return builder.build();
+    }
+
+    public static List<org.eclipse.aether.repository.RemoteRepository> toRepositories( Project project,
+                                                                          RepositorySystemSession session,
+                                                                          RemoteRepositories repos, RemoteRepositoryManager remoteRepositoryManager )
+    {
+        List<RemoteRepository> repositories;
+
+        if ( repos != null )
+        {
+            repositories = repos.getRepositories();
+        }
+        else
+        {
+            repositories = new ArrayList<RemoteRepository>();
+        }
+
+        List<org.eclipse.aether.repository.RemoteRepository> results =
+            new ArrayList<org.eclipse.aether.repository.RemoteRepository>();
+        for ( RemoteRepository repo : repositories )
+        {
+            results.add( toRepository( repo ) );
+        }
+
+        results =
+            remoteRepositoryManager.aggregateRepositories( session,
+                                                      Collections.<org.eclipse.aether.repository.RemoteRepository>emptyList(),
+                                                      results, true );
+
+        return results;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/b5f1ab9c/src/main/java/org/apache/maven/resolver/internal/ant/Names.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/maven/resolver/internal/ant/Names.java b/src/main/java/org/apache/maven/resolver/internal/ant/Names.java
new file mode 100644
index 0000000..3250376
--- /dev/null
+++ b/src/main/java/org/apache/maven/resolver/internal/ant/Names.java
@@ -0,0 +1,44 @@
+package org.apache.maven.resolver.internal.ant;
+
+/*
+ * 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.
+ */
+
+/**
+ */
+public final class Names
+{
+
+    private Names()
+    {
+        // hide constructor
+    }
+
+    public static final String ID = "aether";
+
+    public static final String ID_DEFAULT_REPOS = ID + ".repositories";
+
+    public static final String ID_DEFAULT_POM = ID + ".pom";
+
+    public static final String ID_CENTRAL = "central";
+
+    public static final String PROPERTY_OFFLINE = "aether.offline";
+
+    public static final String SETTINGS_XML = "settings.xml";
+
+}

http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/b5f1ab9c/src/main/java/org/apache/maven/resolver/internal/ant/ProjectWorkspaceReader.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/maven/resolver/internal/ant/ProjectWorkspaceReader.java b/src/main/java/org/apache/maven/resolver/internal/ant/ProjectWorkspaceReader.java
new file mode 100644
index 0000000..8ae2857
--- /dev/null
+++ b/src/main/java/org/apache/maven/resolver/internal/ant/ProjectWorkspaceReader.java
@@ -0,0 +1,144 @@
+package org.apache.maven.resolver.internal.ant;
+
+/*
+ * 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.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.apache.maven.model.Model;
+import org.apache.maven.resolver.internal.ant.types.Pom;
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.artifact.DefaultArtifact;
+import org.eclipse.aether.repository.WorkspaceReader;
+import org.eclipse.aether.repository.WorkspaceRepository;
+import org.eclipse.aether.util.artifact.ArtifactIdUtils;
+
+/**
+ * Workspace reader caching available POMs and artifacts for ant builds.
+ * <p/>
+ * &lt;pom> elements are cached if they are defined by the 'file'-attribute, as they reference a backing pom.xml file that
+ * can be used for resolution with Aether. &lt;artifact> elements are cached if they directly define a 'pom'-attribute
+ * or child. The POM may be file-based or in-memory.
+ */
+public class ProjectWorkspaceReader
+    implements WorkspaceReader
+{
+
+    private static volatile ProjectWorkspaceReader instance;
+
+    private static final Object LOCK = new Object();
+
+    private Map<String, Artifact> artifacts = new ConcurrentHashMap<String, Artifact>();
+
+    public void addPom( Pom pom )
+    {
+        if ( pom.getFile() != null )
+        {
+            Model model = pom.getModel( pom );
+            Artifact aetherArtifact =
+                new DefaultArtifact( model.getGroupId(), model.getArtifactId(), null, "pom", model.getVersion() );
+            aetherArtifact = aetherArtifact.setFile( pom.getFile() );
+            String coords = coords( aetherArtifact );
+            artifacts.put( coords, aetherArtifact );
+        }
+    }
+
+    public void addArtifact( org.apache.maven.resolver.internal.ant.types.Artifact artifact )
+    {
+        if ( artifact.getPom() != null )
+        {
+            Pom pom = artifact.getPom();
+            Artifact aetherArtifact;
+            if ( pom.getFile() != null )
+            {
+                Model model = pom.getModel( pom );
+                aetherArtifact =
+                    new DefaultArtifact( model.getGroupId(), model.getArtifactId(), artifact.getClassifier(),
+                                         artifact.getType(), model.getVersion() );
+            }
+            else
+            {
+                aetherArtifact =
+                    new DefaultArtifact( pom.getGroupId(), pom.getArtifactId(), artifact.getClassifier(),
+                                         artifact.getType(), pom.getVersion() );
+            }
+            aetherArtifact = aetherArtifact.setFile( artifact.getFile() );
+
+            String coords = coords( aetherArtifact );
+            artifacts.put( coords, aetherArtifact );
+        }
+    }
+
+    private String coords( Artifact artifact )
+    {
+        return ArtifactIdUtils.toId( artifact );
+    }
+
+    public WorkspaceRepository getRepository()
+    {
+        return new WorkspaceRepository( "ant" );
+    }
+
+    public File findArtifact( Artifact artifact )
+    {
+        artifact = artifacts.get( coords( artifact ) );
+        return ( artifact != null ) ? artifact.getFile() : null;
+    }
+
+    public List<String> findVersions( Artifact artifact )
+    {
+        List<String> versions = new ArrayList<String>();
+        for ( Artifact art : artifacts.values() )
+        {
+            if ( ArtifactIdUtils.equalsVersionlessId( artifact, art ) )
+            {
+                versions.add( art.getVersion() );
+            }
+        }
+        return versions;
+    }
+
+    ProjectWorkspaceReader()
+    {
+    }
+
+    public static ProjectWorkspaceReader getInstance()
+    {
+        if ( instance == null )
+        {
+            synchronized ( LOCK )
+            {
+                if ( instance == null )
+                {
+                    instance = new ProjectWorkspaceReader();
+                }
+            }
+        }
+        return instance;
+    }
+
+    static void dropInstance()
+    {
+        instance = null;
+    }
+}

http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/b5f1ab9c/src/main/java/org/apache/maven/resolver/internal/ant/SettingsUtils.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/maven/resolver/internal/ant/SettingsUtils.java b/src/main/java/org/apache/maven/resolver/internal/ant/SettingsUtils.java
new file mode 100644
index 0000000..51cb0d1
--- /dev/null
+++ b/src/main/java/org/apache/maven/resolver/internal/ant/SettingsUtils.java
@@ -0,0 +1,182 @@
+package org.apache.maven.resolver.internal.ant;
+
+/*
+ * 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.List;
+
+import org.apache.maven.settings.Activation;
+import org.apache.maven.settings.ActivationFile;
+import org.apache.maven.settings.ActivationOS;
+import org.apache.maven.settings.ActivationProperty;
+import org.apache.maven.settings.Profile;
+import org.apache.maven.settings.Repository;
+import org.apache.maven.settings.RepositoryPolicy;
+
+/**
+ * Utility methods to read settings from Mavens settings.xml.
+ */
+class SettingsUtils
+{
+
+    public static List<org.apache.maven.model.Profile> convert( List<Profile> profiles )
+    {
+        if ( profiles == null )
+        {
+            return null;
+        }
+
+        List<org.apache.maven.model.Profile> results = new ArrayList<org.apache.maven.model.Profile>();
+
+        for ( Profile profile : profiles )
+        {
+            results.add( convert( profile ) );
+        }
+
+        return results;
+    }
+
+    static org.apache.maven.model.Profile convert( Profile profile )
+    {
+        if ( profile == null )
+        {
+            return null;
+        }
+
+        org.apache.maven.model.Profile result = new org.apache.maven.model.Profile();
+
+        result.setId( profile.getId() );
+        result.setProperties( profile.getProperties() );
+        result.setSource( "settings.xml" );
+        result.setActivation( convert( profile.getActivation() ) );
+
+        for ( Repository repo : profile.getRepositories() )
+        {
+            result.addRepository( convert( repo ) );
+        }
+
+        for ( Repository repo : profile.getPluginRepositories() )
+        {
+            result.addPluginRepository( convert( repo ) );
+        }
+
+        return result;
+    }
+
+    static org.apache.maven.model.Activation convert( Activation activation )
+    {
+        if ( activation == null )
+        {
+            return null;
+        }
+
+        org.apache.maven.model.Activation result = new org.apache.maven.model.Activation();
+
+        result.setActiveByDefault( activation.isActiveByDefault() );
+        result.setJdk( activation.getJdk() );
+        result.setFile( convert( activation.getFile() ) );
+        result.setProperty( convert( activation.getProperty() ) );
+        result.setOs( convert( activation.getOs() ) );
+
+        return result;
+    }
+
+    static org.apache.maven.model.ActivationOS convert( ActivationOS activation )
+    {
+        if ( activation == null )
+        {
+            return null;
+        }
+
+        org.apache.maven.model.ActivationOS result = new org.apache.maven.model.ActivationOS();
+
+        result.setArch( activation.getArch() );
+        result.setFamily( activation.getFamily() );
+        result.setName( activation.getName() );
+        result.setVersion( activation.getVersion() );
+
+        return result;
+    }
+
+    static org.apache.maven.model.ActivationProperty convert( ActivationProperty activation )
+    {
+        if ( activation == null )
+        {
+            return null;
+        }
+
+        org.apache.maven.model.ActivationProperty result = new org.apache.maven.model.ActivationProperty();
+
+        result.setName( activation.getName() );
+        result.setValue( activation.getValue() );
+
+        return result;
+    }
+
+    static org.apache.maven.model.ActivationFile convert( ActivationFile activation )
+    {
+        if ( activation == null )
+        {
+            return null;
+        }
+
+        org.apache.maven.model.ActivationFile result = new org.apache.maven.model.ActivationFile();
+
+        result.setExists( activation.getExists() );
+        result.setMissing( activation.getMissing() );
+
+        return result;
+    }
+
+    static org.apache.maven.model.Repository convert( Repository repo )
+    {
+        if ( repo == null )
+        {
+            return null;
+        }
+
+        org.apache.maven.model.Repository result = new org.apache.maven.model.Repository();
+
+        result.setId( repo.getId() );
+        result.setUrl( repo.getUrl() );
+        result.setLayout( repo.getLayout() );
+        result.setReleases( convert( repo.getReleases() ) );
+        result.setSnapshots( convert( repo.getSnapshots() ) );
+
+        return result;
+    }
+
+    static org.apache.maven.model.RepositoryPolicy convert( RepositoryPolicy policy )
+    {
+        if ( policy == null )
+        {
+            return null;
+        }
+
+        org.apache.maven.model.RepositoryPolicy result = new org.apache.maven.model.RepositoryPolicy();
+
+        result.setEnabled( policy.isEnabled() );
+        result.setChecksumPolicy( policy.getChecksumPolicy() );
+        result.setUpdatePolicy( policy.getUpdatePolicy() );
+
+        return result;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/b5f1ab9c/src/main/java/org/apache/maven/resolver/internal/ant/tasks/AbstractDistTask.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/maven/resolver/internal/ant/tasks/AbstractDistTask.java b/src/main/java/org/apache/maven/resolver/internal/ant/tasks/AbstractDistTask.java
new file mode 100644
index 0000000..70bebbc
--- /dev/null
+++ b/src/main/java/org/apache/maven/resolver/internal/ant/tasks/AbstractDistTask.java
@@ -0,0 +1,180 @@
+package org.apache.maven.resolver.internal.ant.tasks;
+
+/*
+ * 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.HashMap;
+import java.util.Map;
+
+import org.apache.maven.model.Model;
+import org.apache.maven.resolver.internal.ant.AntRepoSys;
+import org.apache.maven.resolver.internal.ant.types.Artifact;
+import org.apache.maven.resolver.internal.ant.types.Artifacts;
+import org.apache.maven.resolver.internal.ant.types.Pom;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.types.Reference;
+
+/**
+ */
+public abstract class AbstractDistTask
+    extends Task
+{
+
+    private Pom pom;
+
+    private Artifacts artifacts;
+
+    protected void validate()
+    {
+        getArtifacts().validate( this );
+
+        Map<String, File> duplicates = new HashMap<String, File>();
+        for ( Artifact artifact : getArtifacts().getArtifacts() )
+        {
+            String key = artifact.getType() + ':' + artifact.getClassifier();
+            if ( "pom:".equals( key ) )
+            {
+                throw new BuildException( "You must not specify an <artifact> with type=pom"
+                    + ", please use the <pom> element instead." );
+            }
+            else if ( duplicates.containsKey( key ) )
+            {
+                throw new BuildException( "You must not specify two or more artifacts with the same type ("
+                    + artifact.getType() + ") and classifier (" + artifact.getClassifier() + ")" );
+            }
+            else
+            {
+                duplicates.put( key, artifact.getFile() );
+            }
+
+            validateArtifactGav( artifact );
+        }
+
+        Pom defaultPom = AntRepoSys.getInstance( getProject() ).getDefaultPom();
+        if ( pom == null && defaultPom != null )
+        {
+            log( "Using default POM (" + defaultPom.getCoords() + ")", Project.MSG_INFO );
+            pom = defaultPom;
+        }
+
+        if ( pom == null )
+        {
+            throw new BuildException( "You must specify the <pom file=\"...\"> element"
+                + " to denote the descriptor for the artifacts" );
+        }
+        if ( pom.getFile() == null )
+        {
+            throw new BuildException( "You must specify a <pom> element that has the 'file' attribute set" );
+        }
+    }
+
+    private void validateArtifactGav( Artifact artifact )
+    {
+        Pom artifactPom = artifact.getPom();
+        if ( artifactPom != null )
+        {
+            String gid;
+            String aid;
+            String version;
+            if ( artifactPom.getFile() != null )
+            {
+                Model model = artifactPom.getModel( this );
+                gid = model.getGroupId();
+                aid = model.getArtifactId();
+                version = model.getVersion();
+            }
+            else
+            {
+                gid = artifactPom.getGroupId();
+                aid = artifactPom.getArtifactId();
+                version = artifactPom.getVersion();
+            }
+            
+            Model model = getPom().getModel( this );
+            
+            if ( ! ( model.getGroupId().equals( gid ) && model.getArtifactId().equals( aid ) && model.getVersion().equals( version ) ) )
+            {
+                throw new BuildException( "Artifact references different pom than it would be installed with: "
+                    + artifact.toString() );
+            }
+        }
+    }
+
+    protected Artifacts getArtifacts()
+    {
+        if ( artifacts == null )
+        {
+            artifacts = new Artifacts();
+            artifacts.setProject( getProject() );
+        }
+        return artifacts;
+    }
+
+    public void addArtifact( Artifact artifact )
+    {
+        getArtifacts().addArtifact( artifact );
+    }
+
+    public void addArtifacts( Artifacts artifacts )
+    {
+        getArtifacts().addArtifacts( artifacts );
+    }
+
+    public void setArtifactsRef( Reference ref )
+    {
+        Artifacts artifacts = new Artifacts();
+        artifacts.setProject( getProject() );
+        artifacts.setRefid( ref );
+        getArtifacts().addArtifacts( artifacts );
+    }
+
+    protected Pom getPom()
+    {
+        if ( pom == null )
+        {
+            return AntRepoSys.getInstance( getProject() ).getDefaultPom();
+        }
+
+        return pom;
+    }
+
+    public void addPom( Pom pom )
+    {
+        if ( this.pom != null )
+        {
+            throw new BuildException( "You must not specify multiple <pom> elements" );
+        }
+        this.pom = pom;
+    }
+
+    public void setPomRef( Reference ref )
+    {
+        if ( this.pom != null )
+        {
+            throw new BuildException( "You must not specify multiple <pom> elements" );
+        }
+        pom = new Pom();
+        pom.setProject( getProject() );
+        pom.setRefid( ref );
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/b5f1ab9c/src/main/java/org/apache/maven/resolver/internal/ant/tasks/AbstractResolvingTask.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/maven/resolver/internal/ant/tasks/AbstractResolvingTask.java b/src/main/java/org/apache/maven/resolver/internal/ant/tasks/AbstractResolvingTask.java
new file mode 100644
index 0000000..c19e086
--- /dev/null
+++ b/src/main/java/org/apache/maven/resolver/internal/ant/tasks/AbstractResolvingTask.java
@@ -0,0 +1,107 @@
+package org.apache.maven.resolver.internal.ant.tasks;
+
+/*
+ * 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.resolver.internal.ant.AntRepoSys;
+import org.apache.maven.resolver.internal.ant.types.Dependencies;
+import org.apache.maven.resolver.internal.ant.types.LocalRepository;
+import org.apache.maven.resolver.internal.ant.types.RemoteRepositories;
+import org.apache.maven.resolver.internal.ant.types.RemoteRepository;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.types.Reference;
+import org.eclipse.aether.collection.CollectResult;
+
+/**
+ */
+public abstract class AbstractResolvingTask
+    extends Task
+{
+
+    protected Dependencies dependencies;
+
+    protected RemoteRepositories remoteRepositories;
+
+    protected LocalRepository localRepository;
+
+    public void addDependencies( Dependencies dependencies )
+    {
+        if ( this.dependencies != null )
+        {
+            throw new BuildException( "You must not specify multiple <dependencies> elements" );
+        }
+        this.dependencies = dependencies;
+    }
+
+    public void setDependenciesRef( Reference ref )
+    {
+        if ( dependencies == null )
+        {
+            dependencies = new Dependencies();
+            dependencies.setProject( getProject() );
+        }
+        dependencies.setRefid( ref );
+    }
+
+    public LocalRepository createLocalRepo()
+    {
+        if ( localRepository != null )
+        {
+            throw new BuildException( "You must not specify multiple <localRepo> elements" );
+        }
+        localRepository = new LocalRepository( this );
+        return localRepository;
+    }
+
+    private RemoteRepositories getRemoteRepos()
+    {
+        if ( remoteRepositories == null )
+        {
+            remoteRepositories = new RemoteRepositories();
+            remoteRepositories.setProject( getProject() );
+        }
+        return remoteRepositories;
+    }
+
+    public void addRemoteRepo( RemoteRepository repository )
+    {
+        getRemoteRepos().addRemoterepo( repository );
+    }
+
+    public void addRemoteRepos( RemoteRepositories repositories )
+    {
+        getRemoteRepos().addRemoterepos( repositories );
+    }
+
+    public void setRemoteReposRef( Reference ref )
+    {
+        RemoteRepositories repos = new RemoteRepositories();
+        repos.setProject( getProject() );
+        repos.setRefid( ref );
+        getRemoteRepos().addRemoterepos( repos );
+    }
+
+    protected CollectResult collectDependencies()
+    {
+        return AntRepoSys.getInstance( getProject() ).collectDependencies( this, dependencies, localRepository,
+                                                                           remoteRepositories );
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/b5f1ab9c/src/main/java/org/apache/maven/resolver/internal/ant/tasks/DependencyGraphLogger.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/maven/resolver/internal/ant/tasks/DependencyGraphLogger.java b/src/main/java/org/apache/maven/resolver/internal/ant/tasks/DependencyGraphLogger.java
new file mode 100644
index 0000000..c1fff1d
--- /dev/null
+++ b/src/main/java/org/apache/maven/resolver/internal/ant/tasks/DependencyGraphLogger.java
@@ -0,0 +1,85 @@
+package org.apache.maven.resolver.internal.ant.tasks;
+
+/*
+ * 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.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.graph.Dependency;
+import org.eclipse.aether.graph.DependencyNode;
+import org.eclipse.aether.graph.DependencyVisitor;
+import org.eclipse.aether.util.graph.manager.DependencyManagerUtils;
+
+/**
+ */
+class DependencyGraphLogger
+    implements DependencyVisitor
+{
+
+    private Task task;
+
+    private String indent = "";
+
+    public DependencyGraphLogger( Task task )
+    {
+        this.task = task;
+    }
+
+    public boolean visitEnter( DependencyNode node )
+    {
+        StringBuilder buffer = new StringBuilder( 128 );
+        buffer.append( indent );
+        Dependency dep = node.getDependency();
+        if ( dep != null )
+        {
+            Artifact art = dep.getArtifact();
+
+            buffer.append( art );
+            buffer.append( ':' ).append( dep.getScope() );
+
+            String premanagedScope = DependencyManagerUtils.getPremanagedScope( node );
+            if ( premanagedScope != null && !premanagedScope.equals( dep.getScope() ) )
+            {
+                buffer.append( " (scope managed from " ).append( premanagedScope ).append( ")" );
+            }
+
+            String premanagedVersion = DependencyManagerUtils.getPremanagedVersion( node );
+            if ( premanagedVersion != null && !premanagedVersion.equals( art.getVersion() ) )
+            {
+                buffer.append( " (version managed from " ).append( premanagedVersion ).append( ")" );
+            }
+        }
+        else
+        {
+            buffer.append( "Resolved Dependency Graph:" );
+        }
+
+        task.log( buffer.toString(), Project.MSG_VERBOSE );
+        indent += "   ";
+        return true;
+    }
+
+    public boolean visitLeave( DependencyNode node )
+    {
+        indent = indent.substring( 0, indent.length() - 3 );
+        return true;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/maven-resolver/blob/b5f1ab9c/src/main/java/org/apache/maven/resolver/internal/ant/tasks/Deploy.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/maven/resolver/internal/ant/tasks/Deploy.java b/src/main/java/org/apache/maven/resolver/internal/ant/tasks/Deploy.java
new file mode 100644
index 0000000..742dbc0
--- /dev/null
+++ b/src/main/java/org/apache/maven/resolver/internal/ant/tasks/Deploy.java
@@ -0,0 +1,104 @@
+package org.apache.maven.resolver.internal.ant.tasks;
+
+/*
+ * 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.resolver.internal.ant.AntRepoSys;
+import org.apache.maven.resolver.internal.ant.types.RemoteRepository;
+import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.types.Reference;
+
+/**
+ */
+public class Deploy
+    extends AbstractDistTask
+{
+
+    private RemoteRepository repository;
+
+    private RemoteRepository snapshotRepository;
+
+    @Override
+    protected void validate()
+    {
+        super.validate();
+
+        if ( repository == null )
+        {
+            throw new BuildException( "You must specify the <remoteRepo id=\"...\" url=\"...\"> element"
+                + " to denote the target repository for the deployment" );
+        }
+        else
+        {
+            repository.validate( this );
+        }
+        if ( snapshotRepository != null )
+        {
+            snapshotRepository.validate( this );
+        }
+    }
+
+    public void addRemoteRepo( RemoteRepository repository )
+    {
+        if ( this.repository != null )
+        {
+            throw new BuildException( "You must not specify multiple <remoteRepo> elements" );
+        }
+        this.repository = repository;
+    }
+
+    public void setRemoteRepoRef( Reference ref )
+    {
+        if ( repository == null )
+        {
+            repository = new RemoteRepository();
+            repository.setProject( getProject() );
+        }
+        repository.setRefid( ref );
+    }
+
+    public void addSnapshotRepo( RemoteRepository snapshotRepository )
+    {
+        if ( this.snapshotRepository != null )
+        {
+            throw new BuildException( "You must not specify multiple <snapshotRepo> elements" );
+        }
+        this.snapshotRepository = snapshotRepository;
+    }
+
+    public void setSnapshotRepoRef( Reference ref )
+    {
+        if ( snapshotRepository == null )
+        {
+            snapshotRepository = new RemoteRepository();
+            snapshotRepository.setProject( getProject() );
+        }
+        snapshotRepository.setRefid( ref );
+    }
+
+    @Override
+    public void execute()
+        throws BuildException
+    {
+        validate();
+
+        AntRepoSys.getInstance( getProject() ).deploy( this, getPom(), getArtifacts(), repository, snapshotRepository );
+    }
+
+}