【问题标题】:What's the meaning of user property of maven plugin parametermaven插件参数的用户属性是什么意思
【发布时间】:2014-06-16 23:24:28
【问题描述】:

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

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

【问题讨论】:

    标签: maven


    【解决方案1】:

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

    【讨论】:

    • 嗨,罗布斯,感谢您的回答。但是,从您的回答来看,“用户属性”应该是一个带有布尔值的标志,表示它是否是,但我在插件文档中看到的显示它是一个字符串值。比如插件tomcat7,goal deploy,它只有一个参数mode,但是它的user属性是maven.tomcat.mode。
    • 这个答案是错误的。显然,作者将 Maven 属性与 Java 系统属性混淆了,可以使用 System.getProperty() / System.setProperty() 进行操作。
    • 混淆是可以理解的,因为 Maven 属性是根据系统属性建模的;例如,所有系统属性都可以作为 Maven 属性使用,并且可以使用 -D 在命令行上设置 Maven 属性,就像系统属性一样(仅对于系统属性,-D 必须是 JVM 参数而不是 Java 参数)。
    【解决方案2】:

    我想我可能已经得到了答案,但仍然不能保证。 答案在于 o​​rg.apache.maven.plugins.annotations 包中的注解类型参数。在这种注解类型中,它定义了几个字段。其中:

    1. 别名:这应该在插件文档中定义参数名称。
    2. defaultValue:定义插件文档中每个参数指定的默认值。
    3. 属性:这定义了用户属性。根据这个字段的注释,据说这个属性可以从-D执行,设置属性或者pom属性中指定
    4. readonly:只读标志。
    5. 必填:是否为必填项。

    【讨论】:

      【解决方案3】:

      注意:这是针对 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>
      

      但是,有时从 &lt;configuration&gt; 部分之外设置插件参数很有用,例如在命令行或 Maven 配置文件中设置它。为此,插件还可以声明它将从 Maven 属性(如果已设置)中读取参数值。此属性是文档列为 User 属性的内容。

      failIfNoSpecifiedTests 的 User 属性是 surefire.failIfNoSpecifiedTests。因此,除了上面的&lt;configuration&gt; 部分,还可以使用属性surefire.failIfNoSpecifiedTests。例如:

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

      请注意,插件必须为每个参数声明 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属性。

      【讨论】:

      • 我想补充一点,命令行上提供的任何属性都会覆盖&lt;properties /&gt; pom 部分 (source) 中定义的属性。因此,为了获得最大的灵活性,我建议在&lt;properties /&gt; 中指定默认用户属性值,并可以在命令行上覆盖它们,而不是在&lt;configuration /&gt; 部分中硬编码它们。例如。一个这样的属性maven.compiler.sourcemaven.compiler.target
      • @mucaho 编译器示例更新:为了最大程度的一致性,再次明确指定 &lt;configuration/&gt; 中的编译器版本,以便 javadoc 链接到正确的 java api 版本:&lt;source&gt;${maven.compiler.source}&lt;/source&gt;&lt;target&gt;${maven.compiler.target}&lt;/target&gt;
      • 如果没有定义property,用户属性是什么?前缀是从哪里派生的?
      • @OrangeDog:这听起来像是一个新问题。考虑在某些背景下这样问。
      • @sleske 好吧,你差点就在这里回答了,但是用了错误的例子
      猜你喜欢
      • 1970-01-01
      • 2019-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多