All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.turbosapces.aether.MavenDependencyResolver Maven / Gradle / Ivy

package com.turbosapces.aether;

import java.io.File;
import java.util.Collections;
import java.util.List;
import java.util.Objects;

import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
import org.eclipse.aether.DefaultRepositorySystemSession;
import org.eclipse.aether.RepositorySystem;
import org.eclipse.aether.artifact.Artifact;
import org.eclipse.aether.collection.CollectRequest;
import org.eclipse.aether.connector.basic.BasicRepositoryConnectorFactory;
import org.eclipse.aether.graph.Dependency;
import org.eclipse.aether.graph.DependencyFilter;
import org.eclipse.aether.impl.DefaultServiceLocator;
import org.eclipse.aether.impl.DefaultServiceLocator.ErrorHandler;
import org.eclipse.aether.repository.LocalRepository;
import org.eclipse.aether.repository.RemoteRepository;
import org.eclipse.aether.resolution.ArtifactResult;
import org.eclipse.aether.resolution.DependencyRequest;
import org.eclipse.aether.resolution.DependencyResult;
import org.eclipse.aether.spi.connector.RepositoryConnectorFactory;
import org.eclipse.aether.spi.connector.transport.TransporterFactory;
import org.eclipse.aether.transport.file.FileTransporterFactory;
import org.eclipse.aether.transport.http.HttpTransporterFactory;
import org.eclipse.aether.util.artifact.JavaScopes;
import org.eclipse.aether.util.filter.DependencyFilterUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;

import com.google.common.collect.ImmutableList;

public class MavenDependencyResolver implements DependencyResolver, InitializingBean, DisposableBean {
    public static final String DEFAULT_JAVA_SCOPE = JavaScopes.COMPILE;
    public static final String HOME = System.getenv("HOME");
    public static final File DEFAULT_LOCAL_REPOSITORY = new File(HOME, ".m2/repository");

    private final Logger logger = LoggerFactory.getLogger(getClass());
    private final ImmutableList repos;
    private RepositorySystem repositorySystem;
    private DefaultRepositorySystemSession session;

    public MavenDependencyResolver() {
        this(Collections.emptyList());
    }
    public MavenDependencyResolver(List repos) {
        ImmutableList.Builder remoteRepos = ImmutableList.builder();
        remoteRepos.add(new RemoteRepository.Builder("central", "default", "https://repo1.maven.org/maven2").build());
        remoteRepos.addAll(repos);
        this.repos = remoteRepos.build();
    }
    @Override
    public void afterPropertiesSet() throws Exception {
        repositorySystem = newRepositorySystem();

        LocalRepository localRepo = new LocalRepository(DEFAULT_LOCAL_REPOSITORY);
        session = MavenRepositorySystemUtils.newSession();
        session.setLocalRepositoryManager(repositorySystem.newLocalRepositoryManager(session, localRepo));
    }
    @Override
    public void destroy() throws Exception {
        if (Objects.nonNull(session)) {
            session.setReadOnly();
        }
    }
    @Override
    public List resolveDependency(Artifact artifact) throws Exception {
        DependencyFilter classpathFlter = DependencyFilterUtils.classpathFilter(DEFAULT_JAVA_SCOPE);

        CollectRequest collectRequest = new CollectRequest();
        collectRequest.setRoot(new Dependency(artifact, DEFAULT_JAVA_SCOPE));
        collectRequest.setRepositories(repos);

        DependencyRequest dependencyRequest = new DependencyRequest(collectRequest, classpathFlter);
        DependencyResult dependencyResult = repositorySystem.resolveDependencies(session, dependencyRequest);

        ImmutableList.Builder artifacts = ImmutableList.builder();
        for (ArtifactResult artifactResult : dependencyResult.getArtifactResults()) {
            artifacts.add(artifactResult.getArtifact());
        }
        return artifacts.build();
    }
    private RepositorySystem newRepositorySystem() {
        DefaultServiceLocator locator = MavenRepositorySystemUtils.newServiceLocator();
        locator.addService(RepositoryConnectorFactory.class, BasicRepositoryConnectorFactory.class);
        locator.addService(TransporterFactory.class, FileTransporterFactory.class);
        locator.addService(TransporterFactory.class, HttpTransporterFactory.class);
        locator.setErrorHandler(new ErrorHandler() {
            @Override
            public void serviceCreationFailed(Class type, Class impl, Throwable exception) {
                logger.error(exception.getMessage(), exception);
            }
        });
        return locator.getService(RepositorySystem.class);
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy