3

アーティファクトがローカル リポジトリに既に存在するかどうかを Mojo 内から確認するにはどうすればよいですか?

大きなバイナリをローカルの Maven リポジトリにインストールしていますが、それらをダウンロードする前に既に存在するかどうかを確認する必要があります。

4

3 に答える 3

6

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());

ダウンロードせずにリモートアーティファクトが存在するかどうかを確認する場合は、Aetherライブラリを使用して次の操作を実行できます( 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;

次の依存関係:org.eclipse.aether:aether-util:0.9.0.M2および次のインポート:

import java.net.HttpURLConnection;
import java.net.URI;

import org.eclipse.aether.artifact.Artifact;
import org.eclipse.aether.artifact.DefaultArtifact;
import org.eclipse.aether.repository.RemoteRepository;
import org.eclipse.aether.util.repository.layout.MavenDefaultLayout;
于 2011-01-26T20:24:36.787 に答える
1

アーティファクトがリモートの Maven リポジトリに存在することが予想される場合は、maven-dependency-plugin .

アーティファクトを取得するために通常の Maven 解決メカニズムを使用するため、ローカル リポジトリに既にあるものはダウンロードされません。

プラグインでは、maven 2 (maven3 については不明) を使用する場合、mojo executorを使用して、コード内から簡単に mojo を呼び出すことができます。

于 2011-01-27T12:42:31.353 に答える
1

正しいと認められた回答が有効な URL を指していないため、より良い方法を知っているため、新しい回答を投稿しています。

目標を持つwagon-maven-pluginがあります。existドキュメントは少し不正確ですが、それを使用できます。

コード的には、 DefaultWagonDownloadクラスの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 );
}
于 2013-07-05T16:18:29.017 に答える