【问题标题】:How to get the absolute path for a local maven artifact using groupId,ArtifactId,Version and packaging?如何使用 groupId、ArtifactId、Version 和打包获取本地 maven 工件的绝对路径?
【发布时间】:2017-09-07 15:50:53
【问题描述】:

我有以下字符串来搜索我的本地存储库 ($HOME/.m2/repository) 上的绝对路径:

例如:com.group.example:myartifact:3.1:jar

我期望的输出: $HOME/.m2/repository/com/group/example/myartifact/3.1/myartifact-3.1.jar

有没有什么方法可以使用 Apache Maven 和这些信息来实现这种查找?

注意:输入也可以分开,这样比较方便。

【问题讨论】:

  • 问题:为什么需要这些路径?
  • 我有一个远程存储库,某个团队使用该信息为他们自己的本地存储库获取工件。之后,他们想为下载的工件运行一个插件目标(独立于项目 pom)。问题是,我的示例隐藏了工件的复杂性,它不是 Jar,也不是 Java,它只是 maven 的基本概念,我正在寻找一些不使用外部工具的方法。如果没有选项出现,我还有另一种可能性,是将它复制到我确定在哪里的本地路径,然后通过参数为他们的命令行提供该路径。
  • 如果他们有项目 pom,他们可以简单地进行 maven 构建,所有需要的东西都会被下载?为什么他们需要使其独立于构建?

标签: maven maven-3


【解决方案1】:

可能有两种方法可以实现。


方法 1:以编程方式 - 使用 maven 的库

import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.DefaultArtifact;
import org.apache.maven.artifact.handler.DefaultArtifactHandler;
import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;

Artifact artifact = new DefaultArtifact(groupId, artifactId, version, 
    null, extension, classifier, new DefaultArtifactHandler(extension));
ArtifactRepositoryLayout layout = new DefaultRepositoryLayout();
String artifactPath = layout.pathOf(artifact);

有依赖关系:

<!-- https://mvnrepository.com/artifact/org.apache.maven/maven-artifact -->
<dependency>
    <groupId>org.apache.maven</groupId>
    <artifactId>maven-artifact</artifactId>
    <version>3.8.4</version>
</dependency>

一般来说,上面的代码使用maven的内置代码来获取artifact到本地仓库根目录的相对路径。

限制:这不适用于RELEASELATEST 等伪版本


方法2:使用虚拟项目和dependency:list目标

这种方法权重更大,不是程序化的,但适用于所有场景。

首先,创建一个一次性的 pom.xml,如:

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>dummy</groupId>
    <artifactId>dummy</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <!-- artifact information here -->
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>RELEASE</version>
        </dependency>
    </dependencies>
</project>

然后,在上述pom.xml的父目录下运行如下命令:

mvn -B dependency:list -DoutputAbsoluteArtifactFilename=true -DexcludeTransitive=true | \
    grep -FA1 'The following files have been resolved:' | \
    tail -n 1 | \
    cut -d ':' -f6

你会得到:

/home/vivimice/.m2/repository/org/slf4j/slf4j-api/2.0.0-alpha5/slf4j-api-2.0.0-alpha5.jar

【讨论】:

    猜你喜欢
    • 2023-02-04
    • 2014-06-24
    • 2020-03-11
    • 2011-12-16
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    • 2013-08-30
    • 1970-01-01
    相关资源
    最近更新 更多