
io.airlift.resolver.internal.aether.AetherMavenResolver Maven / Gradle / Ivy
The newest version!
/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.airlift.resolver.internal.aether;
import com.google.inject.AbstractModule;
import io.airlift.resolver.internal.MavenResolver;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.project.DefaultProjectBuildingRequest;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.ProjectBuilder;
import org.apache.maven.project.ProjectBuildingRequest;
import org.apache.maven.project.ProjectBuildingResult;
import org.apache.maven.repository.internal.MavenRepositorySystemSession;
import org.apache.maven.repository.internal.MavenServiceLocator;
import org.codehaus.plexus.ContainerConfiguration;
import org.codehaus.plexus.DefaultContainerConfiguration;
import org.codehaus.plexus.DefaultPlexusContainer;
import org.codehaus.plexus.PlexusConstants;
import org.codehaus.plexus.PlexusContainer;
import org.codehaus.plexus.PlexusContainerException;
import org.codehaus.plexus.classworlds.ClassWorld;
import org.codehaus.plexus.logging.Logger;
import org.slf4j.ILoggerFactory;
import org.slf4j.LoggerFactory;
import org.sonatype.aether.RepositorySystem;
import org.sonatype.aether.artifact.Artifact;
import org.sonatype.aether.collection.CollectRequest;
import org.sonatype.aether.connector.async.AsyncRepositoryConnectorFactory;
import org.sonatype.aether.connector.file.FileRepositoryConnectorFactory;
import org.sonatype.aether.graph.Dependency;
import org.sonatype.aether.impl.internal.SimpleLocalRepositoryManager;
import org.sonatype.aether.repository.LocalRepositoryManager;
import org.sonatype.aether.repository.RemoteRepository;
import org.sonatype.aether.resolution.ArtifactResult;
import org.sonatype.aether.resolution.DependencyRequest;
import org.sonatype.aether.resolution.DependencyResolutionException;
import org.sonatype.aether.resolution.DependencyResult;
import org.sonatype.aether.spi.connector.RepositoryConnectorFactory;
import org.sonatype.aether.util.artifact.DefaultArtifact;
import org.sonatype.aether.util.artifact.JavaScopes;
import org.sonatype.aether.util.filter.DependencyFilterUtils;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class AetherMavenResolver
implements MavenResolver
{
private final RepositorySystem repositorySystem;
private final MavenRepositorySystemSession repositorySystemSession;
private final List repositories;
public AetherMavenResolver(String localRepositoryDir, String... remoteRepositoryUris)
{
this(localRepositoryDir, Arrays.asList(remoteRepositoryUris));
}
public AetherMavenResolver(String localRepositoryDir, List remoteRepositoryUris)
{
MavenServiceLocator locator = new MavenServiceLocator();
locator.addService(RepositoryConnectorFactory.class, FileRepositoryConnectorFactory.class);
locator.addService(RepositoryConnectorFactory.class, AsyncRepositoryConnectorFactory.class);
repositorySystem = locator.getService(RepositorySystem.class);
repositorySystemSession = new MavenRepositorySystemSession();
LocalRepositoryManager localRepositoryManager = new SimpleLocalRepositoryManager(localRepositoryDir);
repositorySystemSession.setLocalRepositoryManager(localRepositoryManager);
repositorySystemSession.setTransferListener(new ConsoleTransferListener());
repositorySystemSession.setRepositoryListener(new ConsoleRepositoryListener());
List repositories = new ArrayList<>(remoteRepositoryUris.size());
int index = 0;
for (String repositoryUri : remoteRepositoryUris) {
repositories.add(new RemoteRepository("repo-" + index++, "default", repositoryUri));
}
this.repositories = Collections.unmodifiableList(repositories);
}
@Override
public List resolveArtifacts(Iterable extends Artifact> sourceArtifacts)
{
CollectRequest collectRequest = new CollectRequest();
for (Artifact sourceArtifact : sourceArtifacts) {
collectRequest.addDependency(new Dependency(sourceArtifact, JavaScopes.RUNTIME));
}
for (RemoteRepository repository : repositories) {
collectRequest.addRepository(repository);
}
DependencyRequest dependencyRequest = new DependencyRequest(collectRequest, DependencyFilterUtils.classpathFilter(JavaScopes.RUNTIME));
DependencyResult dependencyResult;
try {
dependencyResult = repositorySystem.resolveDependencies(repositorySystemSession, dependencyRequest);
}
catch (DependencyResolutionException e) {
dependencyResult = e.getResult();
}
List artifactResults = dependencyResult.getArtifactResults();
List artifacts = new ArrayList<>(artifactResults.size());
for (ArtifactResult artifactResult : artifactResults) {
if (artifactResult.isMissing()) {
artifacts.add(artifactResult.getRequest().getArtifact());
}
else {
artifacts.add(artifactResult.getArtifact());
}
}
return Collections.unmodifiableList(artifacts);
}
@Override
public List resolvePom(File pomFile)
{
if (pomFile == null) {
throw new RuntimeException("pomFile is null");
}
MavenProject pom;
try {
PlexusContainer container = container();
org.apache.maven.repository.RepositorySystem lrs = container.lookup(org.apache.maven.repository.RepositorySystem.class);
ProjectBuilder projectBuilder = container.lookup(ProjectBuilder.class);
ProjectBuildingRequest request = new DefaultProjectBuildingRequest();
request.setRepositorySession(repositorySystemSession);
request.setProcessPlugins(false);
request.setLocalRepository(lrs.createDefaultLocalRepository());
request.setRemoteRepositories(Arrays.asList(new ArtifactRepository[]{lrs.createDefaultRemoteRepository()}.clone()));
ProjectBuildingResult result = projectBuilder.build(pomFile, request);
pom = result.getProject();
}
catch (Exception e) {
if (e instanceof RuntimeException) {
throw (RuntimeException) e;
}
throw new RuntimeException("Error loading pom: " + pomFile.getAbsolutePath(), e);
}
List sourceArtifacts = new ArrayList<>();
for (org.apache.maven.model.Dependency dependency : pom.getDependencies()) {
Artifact artifact = new DefaultArtifact(dependency.getGroupId(), dependency.getArtifactId(), dependency.getClassifier(), dependency.getType(), dependency.getVersion());
sourceArtifacts.add(artifact);
}
return resolveArtifacts(sourceArtifacts);
}
private static PlexusContainer container()
{
try {
ClassWorld classWorld = new ClassWorld("plexus.core", Thread.currentThread().getContextClassLoader());
ContainerConfiguration cc = new DefaultContainerConfiguration()
.setClassWorld(classWorld)
.setRealm(null).setClassPathScanning(PlexusConstants.SCANNING_INDEX)
.setAutoWiring(true)
.setName("maven");
DefaultPlexusContainer container = new DefaultPlexusContainer(cc, new AbstractModule()
{
protected void configure()
{
bind(ILoggerFactory.class).toInstance(LoggerFactory.getILoggerFactory());
}
});
// NOTE: To avoid inconsistencies, we'll use the Thread context class loader exclusively for lookups
container.setLookupRealm(null);
container.setLoggerManager(new Slf4jLoggerManager());
container.getLoggerManager().setThresholds(Logger.LEVEL_INFO);
return container;
}
catch (PlexusContainerException e) {
throw new RuntimeException("Error loading Maven system", e);
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy