我正在编写一个maven插件,其参数是String []。
像这样:
/**
* @parameter expression="${args}"
*/
protected String[] args;
这可以通过像这样的POM来使用:
<args>
<arg>arg1</arg>
<arg>arg2</arg>
<args>
但我想从命令行发送它
-Dargs={arg1, arg2}
这可能吗?
答案 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,如果您是插件开发者并且
并使用以下注释注释您的数组/集合类型插件参数:
/** @parameter expression="${args}" */
通过这种方式,插件参数可以由Maven自动处理,插件用户可以使用逗号分隔的系统属性(如mvn myplugin:mygoal -Dargs=a,b,c
答案 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作业等任务。使用系统属性,您可以更灵活。
就是这样。