问题描述
我需要编写Java代码,以从给定的Maven存储库下载给定的工件(GAV).过去,我使用的是Nexus 2的REST接口(这非常简单),但是我想拥有一些与所使用的存储库(Nexus 2,Nexus 3,Artifactory)无关的东西.
I need to write Java code that downloads a given artifact (GAV) from a given Maven repository. In the past I used the REST interface of Nexus 2 (which is quite easy) but I would like to have something which is independent of the repository (Nexus 2, Nexus 3, Artifactory) used.
在以编程方式获取Maven工件中,提出了类似的问题,但主要答案是2014年,并建议自2014年以来未更新的图书馆.
In Fetching Maven artifacts programmatically a similar question is asked, but the main answer is from 2014 and suggests a library that was not updated since 2014.
推荐答案
使用Aether(版本1.1.0)可以做以下事情:
One can do the following thing with Aether (Version 1.1.0):
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
import org.eclipse.aether.DefaultRepositorySystemSession;
import org.eclipse.aether.RepositorySystem;
import org.eclipse.aether.RepositorySystemSession;
import org.eclipse.aether.artifact.Artifact;
import org.eclipse.aether.artifact.DefaultArtifact;
import org.eclipse.aether.connector.basic.BasicRepositoryConnectorFactory;
import org.eclipse.aether.impl.DefaultServiceLocator;
import org.eclipse.aether.repository.LocalRepository;
import org.eclipse.aether.repository.RemoteRepository;
import org.eclipse.aether.resolution.ArtifactRequest;
import org.eclipse.aether.resolution.ArtifactResolutionException;
import org.eclipse.aether.resolution.ArtifactResult;
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;
public class ArtifactDownload
{
private static RepositorySystem newRepositorySystem()
{
DefaultServiceLocator locator = MavenRepositorySystemUtils
.newServiceLocator();
locator.addService(RepositoryConnectorFactory.class,
BasicRepositoryConnectorFactory.class);
locator.addService(TransporterFactory.class, FileTransporterFactory.class);
locator.addService(TransporterFactory.class, HttpTransporterFactory.class);
return locator.getService(RepositorySystem.class);
}
private static RepositorySystemSession newSession(RepositorySystem system,
File localRepository)
{
DefaultRepositorySystemSession session = MavenRepositorySystemUtils
.newSession();
LocalRepository localRepo = new LocalRepository(localRepository.toString());
session.setLocalRepositoryManager(system.newLocalRepositoryManager(session,
localRepo));
return session;
}
public static File getArtifactByAether(String groupId, String artifactId,
String version, String classifier, String packaging, File localRepository)
throws IOException
{
RepositorySystem repositorySystem = newRepositorySystem();
RepositorySystemSession session = newSession(repositorySystem,
localRepository);
Artifact artifact = new DefaultArtifact(groupId, artifactId, classifier,
packaging, version);
ArtifactRequest artifactRequest = new ArtifactRequest();
artifactRequest.setArtifact(artifact);
List<RemoteRepository> repositories = new ArrayList<>();
RemoteRepository remoteRepository = new RemoteRepository.Builder("public",
"default", "http://somerepo").build();
repositories.add(remoteRepository);
artifactRequest.setRepositories(repositories);
File result;
try
{
ArtifactResult artifactResult = repositorySystem.resolveArtifact(session,
artifactRequest);
artifact = artifactResult.getArtifact();
if (artifact != null)
{
result = artifact.getFile();
}
else
{
result = null;
}
}
catch (ArtifactResolutionException e)
{
throw new IOException("Artefakt " + groupId + ":" + artifactId + ":"
+ version + " konnte nicht heruntergeladen werden.");
}
return result;
}
}
使用以下工件
<dependency>
<groupId>org.eclipse.aether</groupId>
<artifactId>aether-api</artifactId>
<version>${aetherVersion}</version>
</dependency>
<dependency>
<groupId>org.eclipse.aether</groupId>
<artifactId>aether-spi</artifactId>
<version>${aetherVersion}</version>
</dependency>
<dependency>
<groupId>org.eclipse.aether</groupId>
<artifactId>aether-impl</artifactId>
<version>${aetherVersion}</version>
</dependency>
<dependency>
<groupId>org.eclipse.aether</groupId>
<artifactId>aether-connector-basic</artifactId>
<version>${aetherVersion}</version>
</dependency>
<dependency>
<groupId>org.eclipse.aether</groupId>
<artifactId>aether-transport-file</artifactId>
<version>${aetherVersion}</version>
</dependency>
<dependency>
<groupId>org.eclipse.aether</groupId>
<artifactId>aether-transport-http</artifactId>
<version>${aetherVersion}</version>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-aether-provider</artifactId>
<version>${mavenVersion}</version>
</dependency>
使用
<aetherVersion>1.1.0</aetherVersion>
<mavenVersion>3.3.3</mavenVersion>
这篇关于从Java程序中的Maven存储库下载工件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!