问题 maven插件参数的用户属性是什么意思


我是Maven的新手。 当我尝试引用任何maven插件文档时,我总是看到参数定义的以下格式: 名称描述 {参数名称} {description}                          默认值为:...                           用户属性 是:...

在大多数情况下,我看到user属性与参数名称相同。 我想知道“用户属性”和“参数名称”之间有什么区别。我认为参数名称在配置它们时指定对应插件的参数值时应该是元素标签名称,但是“用户属性”的用法是什么?


3846
2018-04-30 14:57


起源



答案:


注意:这适用于Maven 3.早期版本(有点)不同。

TL; DR:

“用户属性”指定的名称 Maven财产 可用于设置插件参数。这允许从外部配置插件 <configuration> 部分。请注意,这仅在参数为时有效  在...中指定 <configuration> 部分(见 MNG-4979 - 无法从命令行覆盖配置参数)。

可以在部分的POM中设置Maven属性 <properties>,或在命令行上 -DmyProperty=myValue


长版

在Maven中,插件的参数通常设置为 <configuration> 部分 在POM中。插件文档中给出的“参数名称”是配置设置中使用的名称。

例如,Surefire目标 神火:测试 有一个参数“failIfNoSpecifiedTests”。要在POM中设置它,请使用:

<configuration>
<failIfNoSpecifiedTests>false</failIfNoSpecifiedTests>
</configuration>

但是,有时从外部设置插件参数很有用 <configuration> 例如,在命令行或Maven配置文件中设置它。为此,插件还可以声明它将从Maven属性(如果设置)读取参数值。此属性是文档列出的属性 用户属性

failIfNoSpecifiedTests的User属性是 surefire.failIfNoSpecifiedTests。所以而不是 <configuration> 在上面的部分中,还可以使用属性surefire.failIfNoSpecifiedTests。例如:

  • 在命令行上,通过指定 -Dsurefire.failIfNoSpecifiedTests=false
  • 在POM配置文件中: <properties> <surefire.failIfNoSpecifiedTests> false </surefire.failIfNoSpecifiedTests> ...

请注意,必须通过插件为每个参数声明User属性,因此并非所有参数都具有一个参数。例如,参数 basedir 没有User属性,因此无法在命令行上设置。


在插件的源代码中,未显式声明参数名称;它取自Java字段的名称。该 “failIfNoSpecifiedTests”的源代码是

/**
 * Set this to "true" to cause a failure if the none of the tests
 * specified in -Dtest=... are run. Defaults to "true".
 *
 * @since 2.12
 */
@Parameter( property = "surefire.failIfNoSpecifiedTests" )
private Boolean failIfNoSpecifiedTests;

您可以看到参数名称“failIfNoSpecifiedTests”取自字段名称。注释参数“property”定义要使用的Maven属性。


14
2018-01-07 15:33



我想补充说,命令行上提供的任何属性都会覆盖在中定义的属性 <properties /> pom节(资源)。因此,为了获得最大的灵活性,我建议在其中指定默认的用户属性值 <properties />,有可能在命令行上覆盖它们,而不是在它们中硬编码 <configuration /> 部分。例如。一个这样的财产 maven.compiler.source 和 maven.compiler.target。 - mucaho
@mucaho更新到编译器示例:为了最大程度的一致性,请指定编译器中的版本 <configuration/> 显式再次,以便javadoc链接到正确的java api版本: <source>${maven.compiler.source}</source> 和 <target>${maven.compiler.target}</target>。 - mucaho


答案:


注意:这适用于Maven 3.早期版本(有点)不同。

TL; DR:

“用户属性”指定的名称 Maven财产 可用于设置插件参数。这允许从外部配置插件 <configuration> 部分。请注意,这仅在参数为时有效  在...中指定 <configuration> 部分(见 MNG-4979 - 无法从命令行覆盖配置参数)。

可以在部分的POM中设置Maven属性 <properties>,或在命令行上 -DmyProperty=myValue


长版

在Maven中,插件的参数通常设置为 <configuration> 部分 在POM中。插件文档中给出的“参数名称”是配置设置中使用的名称。

例如,Surefire目标 神火:测试 有一个参数“failIfNoSpecifiedTests”。要在POM中设置它,请使用:

<configuration>
<failIfNoSpecifiedTests>false</failIfNoSpecifiedTests>
</configuration>

但是,有时从外部设置插件参数很有用 <configuration> 例如,在命令行或Maven配置文件中设置它。为此,插件还可以声明它将从Maven属性(如果设置)读取参数值。此属性是文档列出的属性 用户属性

failIfNoSpecifiedTests的User属性是 surefire.failIfNoSpecifiedTests。所以而不是 <configuration> 在上面的部分中,还可以使用属性surefire.failIfNoSpecifiedTests。例如:

  • 在命令行上,通过指定 -Dsurefire.failIfNoSpecifiedTests=false
  • 在POM配置文件中: <properties> <surefire.failIfNoSpecifiedTests> false </surefire.failIfNoSpecifiedTests> ...

请注意,必须通过插件为每个参数声明User属性,因此并非所有参数都具有一个参数。例如,参数 basedir 没有User属性,因此无法在命令行上设置。


在插件的源代码中,未显式声明参数名称;它取自Java字段的名称。该 “failIfNoSpecifiedTests”的源代码是

/**
 * Set this to "true" to cause a failure if the none of the tests
 * specified in -Dtest=... are run. Defaults to "true".
 *
 * @since 2.12
 */
@Parameter( property = "surefire.failIfNoSpecifiedTests" )
private Boolean failIfNoSpecifiedTests;

您可以看到参数名称“failIfNoSpecifiedTests”取自字段名称。注释参数“property”定义要使用的Maven属性。


14
2018-01-07 15:33



我想补充说,命令行上提供的任何属性都会覆盖在中定义的属性 <properties /> pom节(资源)。因此,为了获得最大的灵活性,我建议在其中指定默认的用户属性值 <properties />,有可能在命令行上覆盖它们,而不是在它们中硬编码 <configuration /> 部分。例如。一个这样的财产 maven.compiler.source 和 maven.compiler.target。 - mucaho
@mucaho更新到编译器示例:为了最大程度的一致性,请指定编译器中的版本 <configuration/> 显式再次,以便javadoc链接到正确的java api版本: <source>${maven.compiler.source}</source> 和 <target>${maven.compiler.target}</target>。 - mucaho


我想我可能得到了答案,但仍然不能保证。 答案取决于包org.apache.maven.plugins.annotations中的注释类型参数。在此注释类型中,它定义了几个字段。其中:

  1. 别名:这应该在插件文档中定义参数名称。
  2. defaultValue:这定义了为插件文档中的每个参数指定的默认值。
  3. 属性:这定义了 用户属性。根据该领域的评论,据说这个属性可以从中指定 -D执行,设置属性或pom属性
  4. readonly:只读标志。
  5. 要求:是否是强制性的。

1
2018-05-01 05:12





它指的是财产适用的背景。例如,有诸如JVM版本,OS名称等的系统属性,它们不是“用户属性”,因为用户不应该设置它们。请注意,这不是Maven特定的概念,它是一种更通用的方式,Java处理与配置相关的各种信息(即,通常是运行进程的平台或上下文的特征)。 “用户属性”只是暗示用户(即运行Maven或配置Maven pom.xml的人)正在设置属性值。


-2
2018-04-30 15:52



嗨,罗布斯,谢谢你的回答。但是,根据你的回答判断,“用户属性”应该是一个带有布尔值的标志,表示它是否是,但是我在插件文档中看到它显示它是一个字符串值。例如,插件tomcat7,目标部署,它有一个参数模式,但其用户属性是maven.tomcat.mode。 - Audison
这个答案是对的。显然,作者将Maven属性与Java系统属性混淆,后者可以使用 System.getProperty() / System.setProperty()。 - sleske
混淆是可以理解的,因为Maven属性是在System属性之后建模的;例如,所有系统属性都可用作Maven属性,并且可以在命令行上使用设置Maven属性 -D,就像系统属性一样(仅适用于系统属性) -D 必须是JVM参数而不是Java参数)。 - sleske