字符串数组作为maven插件的命令行参数

时间:2009-08-26 14:51:57

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

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

像这样:

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

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

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

但我想从命令行发送它

-Dargs={arg1, arg2}

这可能吗?

5 个答案:

答案 0 :(得分:10)

据我所知,你不能直接做到这一点,但接受一个分隔的String并将其自己拆分成一个数组是很常见的做法。

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

下面的一些示例用法:

站点插件:

-Dlocales=enGB,frFR

阶-插件:

-DaddArgs=arg1|arg2|arg3

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

如果这听起来可能对您有用,请查看此answer,其中介绍如何在属性插件中使用外部描述符,或者此answer与xml-maven类似-插入。或者你可以看看assembly-plugin的想法。

答案 1 :(得分:7)

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

-DaddArgs = ARG1,ARG2,ARG3

答案 2 :(得分:1)

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

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

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

  3. 通过这种方式,插件参数可以由Maven自动处理,插件用户可以使用逗号分隔的系统属性(如mvn myplugin:mygoal -Dargs=a,b,c

    通过CLI提供插件数组/集合类型参数

答案 3 :(得分:1)

要更新@nybon的答案,似乎

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

至少在Maven 3.5.0中使用maven-plugin-annotations:3.5时起作用。使用

运行
-Dyour.param=val1,val2

设置列表。

答案 4 :(得分:1)

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

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

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

以下是参考文献的引用:

  

对于许多插件参数,偶尔指定方便   它们的值来自命令行通过系统属性。在过去,   这仅限于String或Boolean等简单类型的参数。   最新的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] STANDALONE服务器正在启动。最大堆大小无效:   -Xmx1536M -XX:MaxMetaspaceSize = 512m -XX:-HapDumpOnOutOfMemoryError

所以你看,maven当它吞下我的系统属性时充满空格它没有进行字符串拆分。所以Wildfly试图设置jvm内存设置,好像最大内存是完整的字符串。 另一方面,当我使用逗号分隔它时,Mojo被正确丰富,我可以在启动时控制应用服务器的内存设置。

当然,您希望使用系统属性而不是pom.xml XML配置来完成设置Jenkins作业等任务。使用系统属性,您可以更灵活。

就是这样。