Maven: Как проверить, существует ли артефакт? - PullRequest
3 голосов
/ 26 января 2011

Как проверить изнутри Mojo, если артефакт уже существует в локальном репозитории?

Я устанавливаю большие двоичные файлы в локальный репозиторий Maven, и мне нужно знать, если они уже существуют, прежде чем пытатьсяскачать их.

Ответы [ 3 ]

4 голосов
/ 26 января 2011

Решено с помощью http://docs.codehaus.org/display/MAVENUSER/Mojo+Developer+Cookbook

/**
 * The local maven repository.
 *
 * @parameter expression="${localRepository}"
 * @required
 * @readonly
 */
@SuppressWarnings("UWF_UNWRITTEN_FIELD")
private ArtifactRepository localRepository;
/**
 * @parameter default-value="${project.remoteArtifactRepositories}"
 * @required
 * @readonly
 */
private List<?> remoteRepositories;
/**
 * Resolves Artifacts in the local repository.
 * 
 * @component
 */
private ArtifactResolver artifactResolver;
/**
 * @component
 */
private ArtifactFactory artifactFactory;
[...]
Artifact artifact = artifactFactory.createArtifactWithClassifier(groupId, artifactId, version, packagingType, classifier);
boolean artifactExists;
try
{
  // Downloads the remote artifact, if necessary
  artifactResolver.resolve(artifact, remoteRepositories, localRepository);
  artifactExists = true;
}
catch (ArtifactResolutionException e)
{
  throw new MojoExecutionException("", e);
}
catch (ArtifactNotFoundException e)
{
  artifactExists = false;
}
if (artifactExists)
  System.out.println("Artifact found at: " + artifact.getFile());

Если вы хотите проверить, существует ли удаленный артефакт без его загрузки, вы можете использовать Эфирную библиотеку , чтобы сделать следующее (на основе http://dev.eclipse.org/mhonarc/lists/aether-users/msg00127.html):

MavenDefaultLayout defaultLayout = new MavenDefaultLayout();
RemoteRepository centralRepository = new RemoteRepository.Builder("central", "default", "http://repo1.maven.org/maven2/").build();
URI centralUri = URI.create(centralRepository.getUrl());
URI artifactUri = centralUri.resolve(defaultLayout.getPath(artifact));
HttpURLConnection connection = (HttpURLConnection) artifactUri.toURL().openConnection();
connection.setRequestMethod("HEAD");
connection.connect();
boolean artifactExists = connection.getResponseCode() != 404;
1 голос
/ 05 июля 2013

Поскольку ответ, который принимается как правильный, больше не указывает на действительные URL-адреса, и поскольку я знаю лучший способ, я публикую новый ответ.

Есть wagon-maven-plugin , цель которого exist. Документация немного неточная, но вы можете использовать это.

В отношении кода вы можете взглянуть на DefaultWagonDownload class 'exists метод:

/**
 * 
 * @param wagon - a Wagon instance
 * @param resource - Remote resource to check
 * @throws WagonException
 */
public boolean exists( Wagon wagon, String resource )
    throws WagonException
{
    return wagon.resourceExists( resource );
}
1 голос
/ 27 января 2011

Если вы ожидаете, что ваши артефакты присутствуют в удаленном хранилище maven, я бы посоветовал вам просто использовать copy mojo maven-dependency-plugin.

Он будет использовать обычный механизм разрешения maven для извлечения артефактов, поэтому не будет загружать то, что уже находится в локальном хранилище.

В плагине, при использовании maven 2 (не уверен в maven3), вы можете использовать mojo executor для простого вызова mojo из вашего кода.

...