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

问题描述:

我在写一个具有String []参数的maven插件。字符串数组作为maven插件的命令行参数

像这样:

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

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

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

但我想在命令行

-Dargs={arg1, arg2} 

是在发送这可能吗?

就我所知,你不能直接做它,但接受一个分隔字符串并将它自己分割成一个数组是非常常见的做法。

例如,maven-site-plugin允许您指定以逗号分隔的区域设置的字符串,而maven-scala-plugin通过允许您使用管道分隔符定义参数来处理此问题。你可以看看相关的Mojos,看看这个论证是如何处理的。

下面的一些例子用法:

网站插件:

-Dlocales=enGB,frFR 

斯卡拉 - 插件:

-DaddArgs=arg1|arg2|arg3 

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

如果这听起来像可能适用于您,请查看answer,它描述了如何在属性插件中使用外部描述符,或者这种类似于xml-maven-plugin的answer。或者你可以看看装配插件的想法。

+0

不幸的是,这也是我的结论。 – torbjornvatn 2009-08-27 12:07:58

+0

我已经添加了一些指向可能有所帮助的替代方法,使用带有外部描述符文件的shared-io将一组配置传递给带有单个参数的插件。 – 2009-08-27 12:22:00

最新的maven(3.0。3)应与工作原理:

-DaddArgs = ARG1,ARG2,ARG3

+0

没有为我工作与maven 3.0.3与-Dgoal.addArgs = x,y,z或-DaddArgs = x,y,z – dcompiled 2012-01-30 17:32:08

+0

有没有一种方法为“地图”类型以及? – ctron 2013-11-21 17:27:47

+0

@dcompiled我不知道为什么它不适合你,但这对我有用。版本3.0.5 exec-maven-plugin -Dexec.arguments = arg1,arg2 – Pyrolistical 2014-01-04 04:58:08

据Sonatype的的博客here,如果你是一个插件开发者和

  1. 使用Maven 3
  2. 和注释您的阵列/集合类型插件参数使用注释如下:

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

以这种方式,该插件参数可通过Maven的自动处理和插件的用户可以使用诸如mvn myplugin:mygoal -Dargs=a,b,c

逗号分隔系统属性要在@ nybon的回答更新经由CLI提供插件阵列/收集型参数有点似乎

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

工作,至少当在Maven 3.5.0中使用maven-plugin-annotations:3.5。用

-Dyour.param=val1,val2 

设置列表。

通过系统属性为插件指定值列表的方式取决于插件的最新状态。然而,如果你正在处理一个正确实现的插件是最新的,那么指定一个插件值的数组的正确方法是通过逗号分隔的字符串。

这里是一个参考: 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的samething。 我会告诉你会发生什么:

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

所以你看,当它与吞噬我的系统属性满的空间就没有做一个字符串分割行家。所以Wildfly试图设置jvm内存设置,就像最大内存是完整的字符串一样。 另一方面,当我使用逗号分隔它时,Mojo得到了充分的充实,并且我可以在启动时控制应用程序服务器的内存设置。

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

就是这样。