【问题标题】:String arrays as command line arguments for maven plugin字符串数组作为 Maven 插件的命令行参数
【发布时间】:2010-11-23 01:06:32
【问题描述】:

我正在编写一个 maven 插件,它的参数是 String[]。

像这样:

/**
* @parameter expression="${args}"
*/
protected String[] args;

这可以通过 POM 像这样使用:

<args>
  <arg>arg1</arg>
  <arg>arg2</arg>
<args>

但我想从命令行发送它

-Dargs={arg1, arg2}

这可能吗?

【问题讨论】:

    标签: maven-2 command-line arguments maven-plugin


    【解决方案1】:

    据我所知,您不能直接执行此操作,但接受分隔字符串并自己将其拆分为数组是很常见的做法。

    例如,maven-site-plugin 允许您指定以逗号分隔的语言环境字符串,而 maven-scala-plugin 通过允许您使用管道分隔符定义参数来处理此问题。您可以查看相关的 Mojo 以了解如何处理参数。

    下面的一些示例用法:

    网站插件:

    -Dlocales=enGB,frFR
    

    scala 插件:

    -DaddArgs=arg1|arg2|arg3
    

    更新:如果你想更优雅地处理这个问题,你可以使用 maven-shared-io 来允许定义外部描述符文件,然后将描述符位置作为属性传递。这意味着单个命令行参数可以引用配置结构。

    如果这听起来对您有用,请查看描述如何在属性插件中使用外部描述符的 answer,或对 xml-maven-plugin 执行类似操作的 answer。或者你可以看看组装插件的想法。

    【讨论】:

    • 这也是我的结论,很遗憾。
    • 我添加了一些指向可能有帮助的替代方法的指针,将 shared-io 与外部描述符文件一起使用,通过单个参数将一组配置传递给插件。
    【解决方案2】:

    最新的 maven (3.0.3) 应该适用于:

    -DaddArgs=arg1,arg2,arg3

    【讨论】:

    • 使用 -Dgoal.addArgs=x,y,z 或 -DaddArgs=x,y,z 的 maven 3.0.3 对我不起作用
    • “地图”类型也有办法吗?
    • @dcompiled 我不知道为什么它对你不起作用,但这对我有用。版本 3.0.5 exec-maven-plugin -Dexec.arguments=arg1,arg2
    【解决方案3】:

    似乎更新了@nybon 的答案

    @Parameter(property="your.param")
    private List<String> yourParam;
    

    至少在 Maven 3.5.0 中使用 maven-plugin-annotations:3.5 时有效。与运行

    -Dyour.param=val1,val2
    

    设置列表。

    【讨论】:

      【解决方案4】:

      根据 Sonatype 的博客here,如果您是插件开发人员并且

      1. 使用 Maven 3

      2. 并使用以下注释注释您的数组/集合类型插件参数:

        /** @parameter expression="${args}" */

      这样,插件参数可以由Maven自动处理,插件用户可以通过CLI使用逗号分隔的系统属性提供插件数组/集合类型参数,如mvn myplugin:mygoal -Dargs=a,b,c

      【讨论】:

        【解决方案5】:

        通过系统属性为插件指定值列表的方式取决于插件的最新程度。

        但是,如果您正在处理正确实施的最新插件,那么为插件指定值数组的正确方法是通过逗号分隔的字符串。

        这是一个参考: http://blog.sonatype.com/2011/03/configuring-plugin-goals-in-maven-3/

        这是引用的引用:

        对于许多插件参数,有时可以方便地指定 通过系统属性从命令行获取它们的值。在过去, 这仅限于简单类型的参数,如字符串或布尔值。 最新的 Maven 版本终于允许插件用户配置 通过逗号分隔的命令行中的集合或数组 字符串。以这样的插件参数为例:

        再进一步,我们可以看看更具体的例子。 考虑一下 Wildfly maven 插件。 此插件有一个已弃用的配置属性,称为: jvmArgs。

        这应该作为空格分隔的值列表传入。 众所周知,在命令行中,摆弄空格并不可爱。 因此,如果我们在插件 mojo 代码中查看此参数的定义,您会发现类似这样的内容(这里有另一个引用)。

        /**
         * A space delimited list of JVM arguments.
         *
         * @deprecated use {@link #javaOpts}
         */
        @Parameter(alias = "jvm-args", property = PropertyNames.JVM_ARGS)
        @Deprecated
        private String jvmArgs;
        

        所以这是旧的做事方式。

        现在,如果您使用的是此插件的最新版本(例如 Alpha6)。 然后源代码将有一个不错的新字段,称为 javaOpts。 让我们看看该字段在代码中的样子。

        /**
         * The JVM options to use.
         */
        @Parameter(alias = "java-opts", property = PropertyNames.JAVA_OPTS)
        private String[] javaOpts;
        

        所以我们看到在 StartMojo 中有一个不错的数组字段。 此数组字段已正确注释。 并且 maven 引擎将完成将值设置到 Mojo 中的繁重工作。

        当您想通过命令行将数据泵入此字段时,您可以在批处理文件中指定以下形式的内容:

        -Dwildfly.javaOpts="-Xmx1536M,-Xms1536M,-XX:MaxMetaspaceSize=512M,-XX:-HeapDumpOnOutOfMemoryError"
        

        如果您尝试使用 sapces 而不是 commans 来做同样的事情。 我会告诉你会发生什么:

        [INFO] 独立服务器正在启动。最大堆大小无效: -Xmx1536M -XX:MaxMetaspaceSize=512m -XX:-HeapDumpOnOutOfMemoryError

        所以你看,当它吞下我的系统属性时,它没有进行字符串拆分。因此 Wildfly 尝试设置 jvm 内存设置,就好像最大内存是那个完整的字符串一样。 另一方面,当我使用逗号分隔时,Mojo 得到了适当的丰富,我可以在应用服务器启动时控制它的内存设置。

        当然,您希望使用系统属性而不是 pom.xml XML 配置来执行诸如设置 Jenkins 作业之类的任务。使用系统属性,您会更加灵活。

        就是这样。

        【讨论】:

          猜你喜欢
          • 2015-12-26
          • 2014-12-11
          • 1970-01-01
          • 2021-12-04
          • 2015-12-17
          • 2018-04-12
          • 1970-01-01
          • 2015-07-19
          • 1970-01-01
          相关资源
          最近更新 更多