【问题标题】:Which URLs does Maven resolve with a subpath in child POMs?Maven 使用子 POM 中的子路径解析哪些 URL?
【发布时间】:2023-03-17 07:17:02
【问题描述】:

我在某处读到,如果 Maven 项目使用继承,那么其子项目将使用子项目的 artifactId 自动将子路径添加到 URL。但是现在找不到参考了。

Maven 会从父 POM 逐字继承哪些继承的 URL,以及它会向哪些继承的 URL 添加子 POM 的子路径?例如,这里有几个我能找到的 URL:

  • <project><url>
  • <project><scm><url>
  • <project><distributionManagement><site><url>

也许我弄错了,他们都没有添加子路径,但我的笔记里有。不幸的是,我似乎无法通过互联网搜索找到明确的答案。

请尝试在您的回答中提供权威参考。 (当然,如果没有这方面的文档,直接测试将是第二好的。)提前致谢。

【问题讨论】:

    标签: java maven


    【解决方案1】:

    所有这些元素都在正确记录的maven XSD schema 中定义(xs:documentation 标记)。

    这是 url 的文档:

    project.url(第 102 行):

    项目主页的URL。
    默认值为:父值[+路径调整]+(artifactId或project.directory属性)

    路径调整仅适用于子项目的路径与其 artifactid 不匹配的情况。

    project.directory 是一个属性,您可以在properties 标记中覆盖它。

    site.url(第 544 行):

    网站部署位置的url,格式为protocol://hostname/path
    默认值为:父值[+路径调整]+artifactId

    scm.url(第 823 行):

    项目的可浏览 SCM 存储库的 URL,例如 ViewVC 或 Fisheye。
    默认值为:父值[+路径调整]+artifactId

    因此,所有这些元素的默认值都包括路径调整和 artifactId。

    还有其他几个名为 url 的元素。并非所有这些都经过路径调整,例如存储库的 url 不是。

    示例

    让我们创建一个涵盖上述所有选项的示例。

    对于这个例子,我们需要一个包含三个模块的项目 (maven-urls):

    • child-project - 一个不覆盖任何东西的常规子模块。
    • child-with-a-project-directory - 声明 project.directory 属性的子模块。
    • path-adjusted-child - 具有意外相对路径的子模块。

    。目录结构应如下所示:

    maven-urls
        child-project
        child-with-a-project-directory
        path
            path-adjusted-child
    

    父项目pom

    这里我们将声明三个不同的 url 和子项目(注意 path-adjusted-child 的路径):

    ...
    <url>https://example.com</url>
    <scm>
        <url>https://example.com/scm</url>
    </scm>
    <modules>
        <module>child-project</module>
        <module>path/path-adjusted-child</module>
        <module>child-with-a-project-directory</module>
    </modules>
    <distributionManagement>
        <site>
            <url>https://example.com/distribution</url>
        </site>
    </distributionManagement>
    ...
    

    项目目录

    对于child-with-a-project-directory,我们将设置project.directory 属性

    ...
    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <project.directory>project</project.directory>
    </properties>
    ...
    

    路径调整项目

    经过路径调整的项目需要声明到父模块的相对路径:

    ...
    <parent>
        ...
        <relativePath>../../pom.xml</relativePath>
    </parent>
    ...
    

    您可以在 github 上查看完整代码:https://github.com/defaultlocale/maven-urls

    结果

    现在我们可以构建整个项目并检查值。我们可以使用 maven 帮助插件,effective-pom 的目标是为每个子项目找到有效的 URL。

    mvn help:effective-pom
    

    这是所有这些的输出:

    child-project:

    <url>https://example.com/child-project</url>
    <scm>
        <url>https://example.com/scm/child-project</url>
    </scm>
    <distributionManagement>
        <site>
            <url>https://example.com/distribution/child-project</url>
        </site>
    </distributionManagement>
    

    这里没有什么意外的。每个 URL 都只是一个附加了 artifactId 的父 URL。

    child-with-a-project-directory:

    ...
    <url>https://example.com/project</url>
    <scm>
        <url>https://example.com/scm/project</url>
    </scm>
    <distributionManagement>
        <site>
            <url>https://example.com/distribution/project</url>
        </site>
    </distributionManagement>
    ...
    

    事实证明,project.directory 会覆盖所有三个 URL 的 artifactId。这是意料之外的,文档中没有介绍。

    path-adjusted-child:

    <url>https://example.com/path/path-adjusted-child</url>
    <scm>
        <url>https://example.com/scm/path/path-adjusted-child</url>
    </scm>
    <distributionManagement>
        <site>
            <url>https://example.com/distribution/path/path-adjusted-child</url>
        </site>
    </distributionManagement>
    ...
    

    毫无疑问,每个 url 都包含一个相对路径和 artifactId。

    【讨论】:

    • 非常有用。请注意,在 maven.apache.org/maven-model/maven.html 可以找到更易读的版本。您是否知道“路径调整”是在哪里定义/描述的?
    • 哇,这是否意味着如果我有一个多项目存储库,其中每个子项目/模块都发布到 Maven Central,那么我必须在每个子 POM 中包含 &lt;scm&gt;&lt;url&gt; 信息或者他们最终会得到不正确的源代码存储库信息?
    • 请注意,maven.apache.org/maven-model/maven.html 表示可以使用project.directory 代替artifactId。这是自动设置的,还是我可以指定的东西来覆盖这个值?它来自哪里?
    • 为什么[+ path adjustment] 在方括号中,好像它是可选的?我假设parent value 也是可选的;括号是否暗示某些特殊条件?什么条件?
    • @GarretWilson 是的,更具可读性的版本参考了架构的 3.5.3 版本。出于某种原因,我找不到最新版本的类似文档页面。这就是我决定链接到 XSD 的原因。
    猜你喜欢
    • 2021-11-16
    • 2013-09-22
    • 2016-10-25
    • 1970-01-01
    • 2013-01-30
    • 2018-08-15
    • 1970-01-01
    • 2011-11-28
    • 2023-04-01
    相关资源
    最近更新 更多