【问题标题】:How to get an Artifact download URL via Maven API?如何通过 Maven API 获取 Artifact 下载 URL?
【发布时间】:2011-02-24 00:10:34
【问题描述】:

我正在尝试创建一个 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?

【问题讨论】:

    标签: maven-2 maven-plugin dependencies resolver


    【解决方案1】:

    我不得不承认我之前从未写过一个 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);
            }
        }
    }
    

    【讨论】:

    • 这是朝着正确方向迈出的一步。我仍然没有得到最终地址,但至少我得到了一份有效候选人的名单。我的实例上的 MavenProject 组件确实有问题(必须添加 @parameter expression="${project}" 来修复它)。
    • Maven API 2.2.1版本表明Artifact接口可以返回ArtifactRepository,ArtifactRepository接口有getUrl函数。希望这不是红鲱鱼^_^
    猜你喜欢
    • 2016-05-29
    • 2019-11-01
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    相关资源
    最近更新 更多