7

プロジェクト内のすべての依存関係へのURLを含むファイルを生成するMavenプラグインを作成しようとしています。依存関係とそのアーティファクトを取得できましたが、ダウンロードURLを取得できません。

ArtifactResolverとArtifactMetadataSourceを使用して、アーティファクト情報の一部を取得します。ただし、すべての依存関係のすべての情報を取得できません。プラグインから呼び出すことができるように、解決ロジックに関するドキュメントを見つけることができませんでした。ArtifactResolverを使用してアーティファクトをダウンロードできますが、本当に必要だったのはURLだけでした。

Maven Artifact APIには、getDownloadURLと呼ばれるメソッドがあります(http://maven.apache.org/ref/2.0.4/maven-artifact/apidocs/org/apache/maven/artifact/Artifact.htmlを参照)。しかし、私はそれに真の価値をもたらす方法を見つけることができないようです。私は常にnull値を取得します。それを解決して(ダウンロードするかどうかにかかわらず)、ファイルの元のURLを取得する方法はありますか?

4

1 に答える 1

6

私はこれまでMavenプラグインを作成したことがなく、あなたの質問を良い学習演習と見なしたことを認めなければなりません。私は、 Javaプラグインの開発に関するMavenガイドとmaven-dependency-pluginのソースコードを多用しました。

私はこれについて間違っているかもしれませんが、Mavenによってどこにでも保存されているアーティファクトとリポジトリの間に直接のマッピングがあるとは思いません。

私はしばらくの間Mavenユーザーでしたが、Mavenがすべてのリモートリポジトリにクエリを実行して、特定のアーティファクトの場所を確認するのをよく目にします。したがって、以下の私のコードでは、アーティファクトの単一のURLを取得することはなく、リモートリポジトリと同じ数のURLを取得します。いつでもこのコードを拡張して、アーティファクトのダウンロードを試み、ダウンロードが成功したURLを保持することができます。

これがお役に立てば幸いです。

package sample.plugin;

import java.util.List;
import java.util.Set;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.factory.ArtifactFactory;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
import org.apache.maven.artifact.resolver.ArtifactResolutionException;
import org.apache.maven.artifact.resolver.filter.ScopeArtifactFilter;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.MavenProjectBuilder;
import org.apache.maven.project.ProjectBuildingException;
import org.apache.maven.project.artifact.InvalidDependencyVersionException;

/**
 * Says "Hi" to the user.
 * @goal sayhi
 */
public class GreetingMojo extends AbstractMojo {

    /**
     * @parameter expression="${localRepository}"
     * @readonly
     * @required
     */
    protected ArtifactRepository local;
    /**
     * @parameter expression="${project.remoteArtifactRepositories}"
     * @readonly
     * @required
     */
    protected List<ArtifactRepository> remoteRepos;
    /**
     * @component role="org.apache.maven.project.MavenProjectBuilder"
     * @required
     * @readonly
     */
    protected MavenProjectBuilder mavenProjectBuilder;
    /**
     * @component
     */
    protected ArtifactFactory factory;
    /**
     * @component
     */
    protected MavenProject project;

    public void execute() throws MojoExecutionException {
        try {
            resolveDependencies(project);
        } catch (Exception ex) {
            getLog().error(ex);
        }
    }

    private void resolveDependencies(MavenProject theProject)
            throws ArtifactResolutionException, ArtifactNotFoundException, InvalidDependencyVersionException, ProjectBuildingException {
        Set<Artifact> artifacts = theProject.createArtifacts(this.factory, Artifact.SCOPE_TEST,
                new ScopeArtifactFilter(Artifact.SCOPE_TEST));
        for (Artifact a : artifacts) {
            System.out.printf("%s : %s : %s\n", a.getGroupId(), a.getArtifactId(), a.getVersion());
            for (ArtifactRepository r : remoteRepos) {
                System.out.printf("%s/%s\n", r.getUrl(), r.pathOf(a));
            }
            System.out.println();
            Artifact pomArtifact = this.factory.createArtifact(a.getGroupId(), a.getArtifactId(), a.getVersion(), "", "pom");
            MavenProject pomProject = mavenProjectBuilder.buildFromRepository(pomArtifact, remoteRepos, local);
            resolveDependencies(pomProject);
        }
    }
}
于 2010-08-09T08:19:36.040 に答える