我是 Maven 的新手。 当我尝试引用任何 Maven 插件文档时,我总是看到以下格式的参数定义: 名称 描述 {参数名称} {描述} 默认值为:... 用户属性是:...
在大多数情况下,我看到用户属性与参数名称相同。 我想知道“用户属性”和“参数名称”之间有什么区别。我认为在配置时指定相应插件的参数值时,参数名称应该是元素标签名称,但是“用户属性”有什么用?
注意:这是针对 Maven 3 的。早期版本(有点)不同。
TL;博士:
“用户属性”指定可用于设置插件参数的 Maven 属性 的名称。这允许从
<configuration>
部分之外配置插件。请注意,只有在<configuration>
部分中指定了not参数时,这才有效(请参阅MNG-4979 - 无法从命令行覆盖配置参数)。
Maven 属性可以在 POM 中的
<properties>
部分设置,或者在命令行中设置为 -DmyProperty=myValue
。
长版
在 Maven 中,插件的参数通常在 POM 中的
<configuration>
部分中设置。插件文档中给出的“参数名称”是在配置设置中使用的名称。
例如,Surefire 目标 surefire:test 有一个参数“failIfNoSpecifiedTests”。要在 POM 中设置它,请使用:
<configuration>
<failIfNoSpecifiedTests>false</failIfNoSpecifiedTests>
</configuration>
但是,有时从
<configuration>
部分外部设置插件参数很有用,例如在命令行或 Maven 配置文件中设置它。为了实现这一点,插件还可以声明它将从 Maven 属性(如果设置)读取参数值。该属性是文档列出的 User 属性。
failIfNoSpecifiedTests 的用户属性是
surefire.failIfNoSpecifiedTests
。因此,除了上面的 <configuration>
部分之外,还可以使用属性surefire.failIfNoSpecifiedTests。例如:
-Dsurefire.failIfNoSpecifiedTests=false
<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 属性。
我想我可能已经得到了答案,但仍不能确定。 答案在于 org.apache.maven.plugins.annotations 包中的注释类型 Parameter。在这个注释类型中,它定义了几个字段。其中:
它指的是属性应用的上下文。例如,诸如 JVM 版本、操作系统名称等系统属性不是“用户属性”,因为用户不应该设置它们。请注意,这不是 Maven 特定的概念,它是 Java 处理与配置相关的各种信息的更通用方式(即通常是进程运行的平台或上下文的特征)。 “用户属性”仅意味着用户,即运行 Maven 或配置 Maven pom.xml 的人,正在设置属性值。