project.parent.name和parent.name之间的差异以及pom.xml中finalName的使用

project.parent.name和parent.name之间的差异以及pom.xml中finalName的使用,xml,maven,maven-3,Xml,Maven,Maven 3,线程的研究。我只想知道- 问题1-maven的pom.xml中的project.parent.attribute和parent.attribute之间有什么区别 目前使用Maven 3.3.9和intellJ作为IDE,我看到的只是两个属性导航到同一个属性。还有一个想法是 是描述符的根 用于定义任何pom.xml,在这种情况下,project.parent.*应等同于模块的parent. 问题2-如果上述解释是合理的,那么finalName属性是否会在其子模块pom.xml调用时覆盖父模块的属性

线程的研究。我只想知道-

问题1-maven的
pom.xml
中的
project.parent.attribute
parent.attribute
之间有什么区别

目前使用Maven 3.3.9和intellJ作为IDE,我看到的只是两个属性导航到同一个属性。还有一个想法是

是描述符的根

用于定义任何pom.xml,在这种情况下,project.parent.*应等同于模块的
parent.

问题2-如果上述解释是合理的,那么
finalName
属性是否会在其子模块pom.xml调用时覆盖父模块的
属性


问题3-父模块的
finalName
${project.name}
的值是多少?是父母的
名字
,还是最里面[打包为
jar
war
等]孩子的
名字

编辑:带链接/示例的扩展答案

问题1
project.parent.attribute
是访问父项目属性的正确方法
parent.attribute
指向相同的值,但已被弃用(Maven 3.3+在构建之初显然对此表示不满)

(请参阅,其中说明
*
pom.*
访问已被弃用)

问题2
name
finalName
完全不相关
name
是项目的明文名称(并且是子项目从未继承的少数元素之一),
finalName
是工件文件的名称

如下列文件所述:

finalName:这是最终构建捆绑项目时的项目名称(无文件扩展名,例如:my-project-1.0.jar)。它默认为${artifactId}-${version}

名称:除了artifactId之外,项目往往有会话名称

所以这两者有不同的用途

  • name
    纯粹是信息性的,主要用于生成的文档和构建日志。它既不会被继承,也不会在其他任何地方使用。它是人类可读的字符串,因此可以包含任何字符,即文件名中不允许的空格或字符。因此,这将是有效的:
    我的涡轮项目速度。这显然至少是工件的一个有问题的文件名

  • 如上所述,
    finalName
    是生成的工件的名称。它是继承的,因此通常应该依赖于属性。只有两个真正有用的选项是默认的
    ${artifactId}-${version}
    和无版本的
    ${artifactId}
    。其他一切都会导致混乱(例如名为
    foo
    的项目创建工件
    bar.jar
    )。事实上,我的涡轮项目!可能是有效的,因为这是一个有效的文件名,但实际上,这样的文件名往往是不可用的(例如,尝试从bash中寻址一个包含!的文件名)

问题3 在pom解析中,首先按顺序应用所有父对象,然后解析属性(始终针对当前项目)。因此,名称将是最里面的子级的名称(但是,请参见上文:不要使用
project.name
,因为它可能包含空格和其他非法字符)

有关更多详细信息,请参阅,此处的相关步骤标记为粗体:

  • 第一阶段
    • 配置文件激活:请参阅可用的激活器。请注意,模型插值尚未发生,然后基于文件的激活的插值仅限于${basedir}(自Maven 3以来)、系统属性和请求属性
    • 原始模型验证:ModelValidator(javadoc),及其DefaultModelValidator实现(源代码)
      • 模型规范化-合并重复项:ModelNormalizer(javadoc),及其DefaultModelNormalizer实现(源代码)
      • 概要文件注入:ProfileInjector(javadoc),及其DefaultProfileInjector实现(源代码)
      • 超级pom前的父级分辨率
      • 继承程序集:InheritanceAssembler(javadoc),及其DefaultInheritanceAssembler实现(源代码)。请注意,project.url、project.scm.connection、project.scm.developerConnection、project.scm.url和project.distributionManagement.site.url有一个特殊的处理方法:如果未在子项中重写,则默认值是附加子项id的父项的值
      • 模型插值(见下文)
      • url规范化:UrlNormalizer(javadoc),及其DefaultUrlNormalizer实现(源代码)
因此,给定两个文件(仅相关部分):

父母亲
parent
父项目
父母
${project.artifactId}-${myProp}
小孩

父母亲
小孩
在儿童时期
这些步骤按以下顺序执行(仅两个重要步骤):

  • 创建一个“世代pom”,包含超级pom之前所有pom的内容:
世代POM

父母亲
小孩
在儿童时期
${project.artifactId}-${myProp}
并不是说世代pom仍然只包含属性,而不包含值

最后,在模型插值中,解决了这些性质。在这一步中,不再使用父pom,在上一步之后,所有操作都只在当前项目的(世代)模型上完成:

有效聚甲醛

父母亲
小孩
在儿童时期
儿童中的儿童

一般来说,
finalName
应谨慎使用。在本地生成的art中删除版本可能很有用
<artifactId>parent</artifactId>

<name>Parent Project</name>

<properties>
  <myProp>in-parent</myProp>
</properties>

<build>
  <finalName>${project.artifactId}-${myProp}</finalName>
</build>
<parent>
    <artifactId>parent</artifactId>
</parent>
<artifactId>child</artifactId>

<properties>
  <myProp>in-child</myProp>
</properties>
<parent>
    <artifactId>parent</artifactId>
</parent>
<artifactId>child</artifactId> <!-- artifact id is never inherited -->

<!-- name is NOT inherited, so no name for child -->

<properties>
  <myProp>in-child</myProp> <!-- from child -->
</properties>

<build> <!-- inherited from parent -->
  <finalName>${project.artifactId}-${myProp}</finalName>
</build>
<parent>
    <artifactId>parent</artifactId>
</parent>
<artifactId>child</artifactId> <!-- artifact id is never inherited -->

<!-- name is NOT inherited, so no name for child -->

<properties>
  <myProp>in-child</myProp> <!-- from child -->
</properties>

<build> <!-- inherited from parent -->
  <finalName>child-in-child</finalName> <!-- resolved against generational pom -->
</build>