【发布时间】:2014-06-16 23:24:28
【问题描述】:
我是 Maven 的新手。 当我尝试引用任何 maven 插件文档时,我总是看到以下格式的参数定义: 名称 说明 {参数名称} {描述} 默认值为:... 用户属性是:...
在大多数情况下,我看到用户属性与参数名称相同。 我想知道“用户属性”和“参数名称”之间有什么区别。我认为在配置时指定对应插件的参数值时参数名称应该是元素标签名称,但是“用户属性”有什么用?
【问题讨论】:
标签: maven
我是 Maven 的新手。 当我尝试引用任何 maven 插件文档时,我总是看到以下格式的参数定义: 名称 说明 {参数名称} {描述} 默认值为:... 用户属性是:...
在大多数情况下,我看到用户属性与参数名称相同。 我想知道“用户属性”和“参数名称”之间有什么区别。我认为在配置时指定对应插件的参数值时参数名称应该是元素标签名称,但是“用户属性”有什么用?
【问题讨论】:
标签: maven
它指的是属性应用的上下文。例如,JVM 版本、操作系统名称等系统属性不是“用户属性”,因为用户不应该设置它们。请注意,这不是 Maven 特定的概念,它是 Java 处理与配置相关的各种信息的更通用方式(即通常是平台的特征或进程正在运行的上下文)。 “用户属性”只是意味着用户,即运行 Maven 或配置 Maven pom.xml 的人,正在设置属性值。
【讨论】:
System.getProperty() / System.setProperty() 进行操作。
-D 在命令行上设置 Maven 属性,就像系统属性一样(仅对于系统属性,-D 必须是 JVM 参数而不是 Java 参数)。
我想我可能已经得到了答案,但仍然不能保证。 答案在于 org.apache.maven.plugins.annotations 包中的注解类型参数。在这种注解类型中,它定义了几个字段。其中:
【讨论】:
注意:这是针对 Maven 3 的。早期版本(有点)不同。
TL;DR:
“用户属性”指定可用于设置插件参数的Maven property 的名称。这允许从<configuration> 部分之外配置插件。请注意,这仅在<configuration> 部分中未指定参数时才有效(请参阅MNG-4979 - Cannot override configuration parameter from command line)。
Maven 属性可以在 POM 中的 <properties> 部分中设置,或者在命令行中设置为 -DmyProperty=myValue。
加长版
在 Maven 中,插件的参数通常设置在 POM 的 <configuration> 部分中。插件文档中给出的“参数名称”是要在配置设置中使用的名称。
例如,Surefire 目标surefire:test 有一个参数“failIfNoSpecifiedTests”。要在 POM 中设置它,请使用:
<configuration>
<failIfNoSpecifiedTests>false</failIfNoSpecifiedTests>
</configuration>
但是,有时从 <configuration> 部分之外设置插件参数很有用,例如在命令行或 Maven 配置文件中设置它。为此,插件还可以声明它将从 Maven 属性(如果已设置)中读取参数值。此属性是文档列为 User 属性的内容。
failIfNoSpecifiedTests 的 User 属性是 surefire.failIfNoSpecifiedTests。因此,除了上面的<configuration> 部分,还可以使用属性surefire.failIfNoSpecifiedTests。例如:
-Dsurefire.failIfNoSpecifiedTests=false
<properties> <surefire.failIfNoSpecifiedTests> false </surefire.failIfNoSpecifiedTests> ...
请注意,插件必须为每个参数声明 User 属性,因此并非所有参数都有一个。比如参数basedir没有User属性,所以不能在命令行设置。
在插件的源码中,参数名没有显式声明;它取自 Java 字段的名称。 source code for "failIfNoSpecifiedTests" is:
/**
* 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属性。
【讨论】:
<properties /> pom 部分 (source) 中定义的属性。因此,为了获得最大的灵活性,我建议在<properties /> 中指定默认用户属性值,并可以在命令行上覆盖它们,而不是在<configuration /> 部分中硬编码它们。例如。一个这样的属性maven.compiler.source 和maven.compiler.target。
<configuration/> 中的编译器版本,以便 javadoc 链接到正确的 java api 版本:<source>${maven.compiler.source}</source> 和 <target>${maven.compiler.target}</target>。
property,用户属性是什么?前缀是从哪里派生的?