Maven 2 如何通过Maven API获得工件下载URL?

Maven 2 如何通过Maven API获得工件下载URL?,maven-2,maven-plugin,dependencies,resolver,Maven 2,Maven Plugin,Dependencies,Resolver,我正在尝试创建一个maven插件来生成一个文件,其中包含指向项目中所有依赖项的URL。我已经能够获取依赖项和它们的工件,但是我在获取下载URL时遇到了问题 使用ArtifactResolver和ArtifactMetadataSource,我获得了一些工件信息。但是,我无法获得所有依赖项的所有信息。我还没有找到关于解析逻辑的文档,所以我可以从插件中调用它。 我可以使用ArtifactResolver下载工件,但我真正想要的只是URL Maven工件API有一个名为getDownloadURL的方

我正在尝试创建一个maven插件来生成一个文件,其中包含指向项目中所有依赖项的URL。我已经能够获取依赖项和它们的工件,但是我在获取下载URL时遇到了问题

使用ArtifactResolver和ArtifactMetadataSource,我获得了一些工件信息。但是,我无法获得所有依赖项的所有信息。我还没有找到关于解析逻辑的文档,所以我可以从插件中调用它。 我可以使用ArtifactResolver下载工件,但我真正想要的只是URL

Maven工件API有一个名为getDownloadURL的方法(请参阅)。然而,我似乎找不到一种方法来获得真正的价值。我总是得到一个空值。有没有办法解决(下载或不下载)问题并获取文件来源的URL?

我必须承认,我以前从未编写过Maven插件,并将您的问题视为一个很好的学习练习。我从中大量借用了,源代码来自

这一点我可能是错的,但我不认为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);
        }
    }
}
package sample.plugin;
导入java.util.List;
导入java.util.Set;
导入org.apache.maven.artifact.artifact;
导入org.apache.maven.artifact.factory.ArtifactFactory;
导入org.apache.maven.artifact.repository.ArtifactRepository;
导入org.apache.maven.artifact.resolver.ArtifactNotFoundException;
导入org.apache.maven.artifact.resolver.ArtifactResolutionException;
导入org.apache.maven.artifact.resolver.filter.ScopeArtifactFilter;
导入org.apache.maven.plugin.AbstractMojo;
导入org.apache.maven.plugin.MojoExecutionException;
导入org.apache.maven.project.MavenProject;
导入org.apache.maven.project.MavenProjectBuilder;
导入org.apache.maven.project.ProjectBuildingException;
导入org.apache.maven.project.artifact.InvalidDependencyVersionException;
/**
*向用户说“嗨”。
*@goal sayhi
*/
公共类GreetingMojo扩展了AbstractMojo{
/**
*@parameter expression=“${localRepository}”
*@readonly
*@必需
*/
本地受保护工件库;
/**
*@parameter expression=“${project.remoteArtifactRepositories}”
*@readonly
*@必需
*/
受保护的远程回购清单;
/**
*@component role=“org.apache.maven.project.MavenProjectBuilder”
*@必需
*@readonly
*/
受保护的MavenProjectBuilder MavenProjectBuilder;
/**
*@组件
*/
受保护的人工制品工厂;
/**
*@组件
*/
受保护的Maven项目;
public void execute()引发MojoExecutionException异常{
试一试{
(项目);
}捕获(例外情况除外){
getLog()错误(ex);
}
}
私有void resolveDependencies(MavenProject项目)
抛出ArtifactResolutionException、ArtifactNotFoundException、InvalidDependencyVersionException、ProjectBuildingException{
Set artifacts=project.createArtifacts(this.factory,Artifact.SCOPE\u TEST,
新的ScopeArtifactFilter(Artifact.SCOPE_TEST));
for(工件a:工件){
System.out.printf(“%s:%s:%s\n”、a.getGroupId()、a.getArtifactId()、a.getVersion());
for(artifactr: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(pomaartifact、remoteRepos、local);
(pomProject);
}
}
}

这是朝着正确方向迈出的一步。我仍然没有得到最终地址,但至少我得到了一份有效候选人的名单。我的实例上的MavenProject组件确实存在问题(必须添加@parameter expression=“${project}”来修复它)。Maven API的2.2.1版表明,ArtifactRepository接口可以返回ArtifactRepository,并且ArtifactRepository接口具有getUrl函数。希望这不是在转移视线^_^