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

2023-11-26

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


我必须承认我有never之前写过一个 Maven 插件,并将你的问题视为一个很好的学习练习。我借了很多钱开发 Java 插件的 Maven 指南和源代码来自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);
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过 Maven API 获取 Artifact 下载 URL? 的相关文章

随机推荐

  • 如何更新应用程序?

    互联网上似乎没有太多用于更新 Android 应用程序的资源 那么 我需要做的就是更改应用程序的 build gradle 文件中的版本号和名称吗 versionCode 2 versionName 1 0 1 这就是全部 现在我只需要制作
  • 即使一项检查失败如何继续执行

    我正在尝试访问不同的网址并使用 matchImageSnapshot 将屏幕截图与基线图像进行比较 这里的问题是当我的一个 url 因 matchimagesnapshot 失败时 它不会继续到下一个 URL 注意 我尝试使用变量 env
  • 获取插入后生成的id

    我正在 Android 上使用 SQLite 我想知道获取我插入的行的生成 id 的最佳方法 我认为解决方案在包含后进行搜索 但它看起来不是最好的方法 The insert方法返回id刚刚插入的行或 1如果插入过程中出现错误 long id
  • 滚动到带有标题的 Xamarin Forms ListView 的开头

    我在 Xamarin Forms 中滚动到 ListView 顶部时遇到一些问题 我可以通过调用 ScrollTo 并传递第一项来滚动到第一项 问题是 当列表有标题项时 我找不到滚动到标题的方法 这可能吗 我能想到的唯一解决方法是不使用标头
  • “new new Something”如何在 JavaScript 中产生有效的结果?

    我目前正在开发一个 JavaScript 解析器并研究ECMAScript 5 1 规范 这是目前令我困惑的一个问题 11 2 左侧表达式定义以下内容NewExpression生产 NewExpression MemberExpressio
  • 密码散列的盐也应该被“散列”吗?

    我认为这可能是一个愚蠢的问题 但我已经很困惑我应该在这里做什么才能最好 对密码哈希进行加盐处理时 盐是否也应该进行哈希处理还是保留为明文 注意 我正在对 SHA 256 中的密码进行哈希处理 并且 Salt 是预定义的字符串 因为一次只会存
  • 并发文件写入

    如何写入可由多个源 可能以并发方式 访问的文本文件 确保不会丢失写入操作 例如 如果两个不同的进程在同一时刻写入文件 这可能会导致问题 简单的解决方案 不是很快也不是很优雅 是在开始进程时锁定文件 创建 lock 文件或类似文件 并在写入完
  • 如何优化在 date 的 where 子句中包含 to_char 的 Oracle 查询

    我有一张表 其中包含49403459记录 我想查询某个日期范围内的表 说04 10 2010 to 04 10 2010 但是 日期以格式存储在表中10 APR 10 10 15 06 000000 AM 时间戳 结果当我这样做时 SELE
  • 在 .NET Web API POST/PUT 方法中使用继承的类

    我不知道如何在 Web API 控制器中使用继承的类 我have to create only oneAPI 控制器用于创建和更新数据库中继承的对象 与我的模型类似 所有这些模型都存在 Dto public class Animal pub
  • 在 WordPress 的自定义管理页面上提交表单

    我在 WordPress 管理中创建了一个自定义页面 其中有一个简单的文件上传字段和一个提交按钮 我需要弄清楚如何将页面提交到可以处理但在网络上找不到任何内容的地方 有谁知道表单上需要什么 操作 才能使其转到一个函数或另一个我可以处理文件的
  • 打印html元素时如何获得正确的渲染尺寸

    当将 html 元素打印到 A4 尺寸的纸张上时 我无法理解如何以正确的尺寸呈现 html 元素 为了说明我的目的 我将代码简化为一个 html 页面 其中包含一个红色边框的表格 该表格的尺寸应为 210mmx297mm A4 纸张尺寸
  • 通过 os.system() 终止进程中启动的脚本

    我有一个 python 脚本 它启动多个进程 每个进程基本上只是调用一个 shell 脚本 from multiprocessing import Process import os import logging def thread me
  • JavaScript 将 4 个字节的数组转换为 modbusTCP 读取的浮点值

    我正在尝试将 4 个字节的数组转换为浮点值 事情是这样的 我通过 ModbusTCP 从我的请求中得到答案 看起来像这样 data 16610 40202 buffer type Buffer data 64 226 157 10 该字符串
  • Hbase错误zookeeper存在3次退休后失败

    我在 Ubuntu 中使用 HBASE 0 94 8 独立模式 它工作正常 我能够在 Hbase shell 中执行所有操作 但在我登录我的系统后 它给出以下错误 15 07 28 15 10 30 ERROR zookeeper Reco
  • Guzzle 和 HTTPS

    我想使用 Guzzle 和 Silex 向 https 页面发送请求 通过 http url 我有一个响应 app gt get function use app client response client gt get http www
  • Laravel 模型中的动态填充

    陷入 Laravel 5 2 的问题 以下是 eloquent 创建操作 调用后 期间的错误 Model php 中的批量分配异常 453 column name 以下是需要考虑的先决条件 模型中的可填充项通过以下代码以动态方式填充 pub
  • 如何在android中捕获长按音量减小键?

    只是想知道是否有人可以告诉我如何捕获 android 中音量减小键的长按键 详细问题 我想创建一个广播接收器它将接收音量长按键事件 没有任何 UI 交互 我知道搜索按钮是可能的 音量键可以用吗 Thanks 也许下面的代码会对您有所帮助 O
  • 如何在 AngularJS 中设置 cookie 的过期日期

    我们希望将用户的授权信息存储在 cookie 中 该信息不应在浏览器刷新 F5 时丢失 我们希望将授权信息存储在 permanent cookie 中 以防用户在登录时选择 记住我 复选框 这在 1 4 0 版本的 Angular 中可以使
  • 计算适合矩形的最大字体大小?

    我试图找到适合给定字符串的给定矩形的最大字体大小 该算法的目标是用尽可能大的字体填充尽可能多的矩形 我的方法 根据我在网上找到的方法进行修改 做得不错 但它通常不能填满整个矩形 我希望看到一些关于如何改进该算法的合作 以便每个人都可以从中受
  • 如何通过 Maven API 获取 Artifact 下载 URL?

    我正在尝试创建一个 Maven 插件来生成一个文件 其中包含项目中所有依赖项的 URL 我已经能够获取依赖项及其工件 但在获取下载 URL 时遇到问题 使用 ArtifactResolver 和 ArtifactMetadataSource