我正在编写一个 Maven 插件,它的参数是 String []。
像这样:
/**
* @parameter expression="${args}"
*/
protected String[] args;
这可以通过 POM 像这样使用:
<args>
<arg>arg1</arg>
<arg>arg2</arg>
<args>
但我想从命令行发送它
-Dargs={arg1, arg2}
这可能吗?
我正在编写一个 Maven 插件,它的参数是 String []。
像这样:
/**
* @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
scala插件:
-DaddArgs=arg1|arg2|arg3
更新:如果你想更优雅地处理这个问题,你可以使用 maven-shared-io 来允许定义外部描述符文件,然后将描述符位置作为属性传递。这意味着单个命令行参数可以引用配置结构。
如果这听起来可能对您有用,请查看描述如何在属性插件中使用外部描述符的这个答案,或者这个对xml-maven-plugin 有类似作用的答案。或者您可以只查看组装插件的想法。
最新的 maven (3.0.3) 应该适用于:
-DaddArgs=arg1,arg2,arg3
要更新@nybon的答案,似乎
@Parameter(property="your.param")
private List<String> yourParam;
至少maven-plugin-annotations:3.5
在 Maven 3.5.0 中使用时有效。与运行
-Dyour.param=val1,val2
设置列表。
根据这里Sonatype 的博客,如果您是插件开发人员并且
使用 Maven 3
并使用以下注释注释您的数组/集合类型插件参数:
/** @parameter expression="${args}" */
这样,插件参数可以由 Maven 自动处理,插件用户可以通过 CLI 使用逗号分隔的系统属性提供插件数组/集合类型参数,例如mvn myplugin:mygoal -Dargs=a,b,c
对于插件,通过系统属性指定值列表的方式取决于插件的最新程度。
但是,如果您正在处理一个正确实现的最新插件,那么为插件指定值数组的正确方法是通过逗号分隔的字符串。
这是一个参考: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] 独立服务器正在启动。最大堆大小无效:-Xmx1536M -XX:MaxMetaspaceSize=512m -XX:-HeapDumpOnOutOfMemoryError
所以你看,当它吞下我的充满空格的系统属性时,maven 并没有进行字符串拆分。因此 Wildfly 尝试设置 jvm 内存设置,就好像最大内存是那个完整的字符串一样。另一方面,当我使用逗号分隔它时,Mojo 得到了适当的丰富,并且我可以在应用服务器启动时控制它的内存设置。
当然,对于设置 Jenkins 作业等任务,您希望使用系统属性而不是 pom.xml XML 配置。使用系统属性,您会更加灵活。
这就对了。