如何通过Maven API获取Artifact下载URL?

时间:2010-05-26 05:04:53

标签: maven-2 maven-plugin dependencies resolver

我正在尝试创建一个maven插件来生成一个文件,其中包含项目中所有依赖项的URL。我已经能够获得依赖项及其工件,但我无法获取下载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)。但是,我似乎无法找到一种方法来获得真正的价值。我总是得到一个空值。有没有办法让它解决(下载与否)并获取文件来源的URL?

1 个答案:

答案 0 :(得分:5)

我必须承认我之前从未编写过Maven插件,并认为您的问题是一个很好的学习练习。我从Maven Guide to Developing Java Pluginsmaven-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);
        }
    }
}