project.parent.name和parent.name之间的差异以及pom.xml中finalName的使用
线程的研究。我只想知道- 问题1-maven的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调用时覆盖父模块的属性
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
)。事实上,我的涡轮项目!可能是有效的,因为这是一个有效的文件名,但实际上,这样的文件名往往是不可用的(例如,尝试从bash中寻址一个包含!的文件名)bar.jar
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的内容:
父母亲
小孩
在儿童时期
${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>