【问题标题】:How does one refer to a file in a maven dependency?如何在 Maven 依赖项中引用文件?
【发布时间】:2021-01-21 18:16:06
【问题描述】:

上下文

我在集成测试期间使用 maven 插件 Fabric8 构建 docker 容器。我的 maven 依赖项之一在其 src/main/resources 文件夹中有一个 Dockerfile。

我想在插件镜像配置的构建阶段引用那个 Dockerfile。

在 Intellij 中,我可以在 External Libraries 部分看到 Dockerfile。

Maven: com.example.project:myartifact:1.0-SNAPSHOT
  myartifact-1.0-SNAPSHOT.jar
    container-dir
      Dockerfile

问题

如何引用外部库/Maven 依赖项中的文件?

换句话说,一个 mvn 项目的依赖文件的相对路径是什么?

其他信息

在代码中的位置:

<configuration>
    <images>
        <image>
            <alias>database</alias>
            <name>container-name</name>
            <build>
                <dockerFileDir>?????</dockerFileDir>
            </build>

我见过这个问题:Reading a resource file from within jar,但这仅回答了如何在 Java 中引用文件的问题,而不是在 Maven 本身中。

【问题讨论】:

    标签: maven fabric8


    【解决方案1】:

    依赖项是 JAR。 JAR 是 ZIP。它们是从本地 Maven 存储库中解析的(${user.home}/.m2/repository 默认为 settings.xml)(如果有远程存储库并且本地存储库中还没有,则从远程存储库下载)。因此,您不能直接通过(相对或绝对)路径访问其中的文件。

    如果这是您自己创建的依赖项(您提到了 src/main/resources),则相对路径取决于您的目录结构,例如:

    +- dependency
    |  +- src/main/resources
    |     +- Dockerfile
    +- project
       + pom.xml
    

    如果您在/project 内运行mvn ...,那么从project 的角度来看,它将是../dependency/src/main/resources/Dockerfile。如果您使用 .../not-project $ mvn -f /path/to/project/pom.xml ... 从其他位置运行它,那么您就不走运了。

    例如,如果有人签出了project 而不是dependency(因为后者无论如何都是从存储库中解析的)(s)他完全不走运。

    因此,我不建议这样做,因为依赖项目外部的本地路径不太安全。更安全和 Maven 的方法是将此资源放在 project/src/main/resources 中(此目录的名称并非偶然;)。

    OTOH,我知道将 Dockerfile 保留在其 dependency 项目中,因为它属于它的开发。

    要使其对project 可用,您可以将maven-dependency-plugin:unpackUsage page section 一起使用(这对于&lt;executions&gt;&lt;configuration&gt; 来说有点令人困惑):

    从存储库中检索工件列表并将它们解压缩到定义位置的目标。

    【讨论】:

      猜你喜欢
      • 2014-11-25
      • 1970-01-01
      • 2012-07-01
      • 2016-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-27
      • 2016-04-13
      相关资源
      最近更新 更多