Строковые массивы как аргументы командной строки для плагина maven

Я пишу плагин maven, который имеет параметр, который является строкой[].

такой:

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

Это можно использовать через POM как это:

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

но я хочу отправить его из командной строки

-Dargs={arg1, arg2}

это возможно?

5 ответов


вы не можете сделать это напрямую, насколько я знаю, но довольно распространенная практика-принять строку с разделителями и разделить ее на массив самостоятельно.

например maven-site-plugin позволяет указать строку локалей с разделителями-запятыми, в то время как maven-scala-plugin обрабатывает это, позволяя определить аргументы с помощью разделителя труб. Вы можете посмотреть на соответствующие Mojos, чтобы увидеть, как обрабатывается аргумент.

некоторые пример использования ниже:

сайт-плагин:

-Dlocales=enGB,frFR

скала-плагин:

-DaddArgs=arg1|arg2|arg3

Update: если вы хотите обработать это более элегантно, вы можете использовать maven-shared-io, чтобы разрешить определение внешнего файла дескриптора, а затем передать местоположение дескриптора как свойство. Это означает, что один аргумент командной строки может ссылаться на структуру конфигурации.

Если это звучит так, как будто это может сработать для вас, взгляните на это ответ что описывает, как использовать внешние дескрипторы в плагине свойств, или это ответ это похоже на XML-Maven-плагин. Или вы можете просто посмотреть на assembly-plugin для идей.


последний maven (3.0.3) должен работать с:

-DaddArgs=arg1, arg2, arg3


согласно блогу Sonatype здесь, если вы разработчик плагинов и

  1. использовать Maven 3
  2. и аннотировать параметр плагина типа массива/коллекции, используя аннотацию типа:

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

таким образом, параметр плагина может обрабатываться Maven автоматически, а пользователи плагина могут предоставлять параметры типа массива/коллекции плагинов через CLI, используя системное свойство, разделенное запятыми как mvn myplugin:mygoal -Dargs=a,b,c


чтобы обновить ответ @nybon немного, кажется

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

работает, по крайней мере, при использовании maven-plugin-annotations:3.5 в Maven 3.5.0. Бег с

-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. Это поле массив правильно annoted. И двигатель maven сделает тяжелый подъем установки значений в Mojo.

когда вы хотите нагнести данные в в этом поле через командную строку в пакетном файле указать что-то вида:

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

Если вы попробуете samething, используя sapces вместо commans. Я покажу вам, что происходит:

[INFO] запускается автономный сервер. Недопустимый максимальный размер кучи: - Xmx1536M-XX: MaxMetaspaceSize=512m-XX: - HeapDumpOnOutOfMemoryError

Итак, вы видите, maven, когда он проглотил мое системное свойство, полное пробелов, он не сделал строку расщеплять. Поэтому Wildfly попытался настроить параметры памяти jvm, как если бы максимальная память была полной строкой. С другой стороны, когда я использую запятые для его разделения, Моджо правильно обогащается, и я могу контролировать настройки памяти сервера приложений при его запуске.

и, конечно, вы хотите использовать системные свойства, а не pom.XML XML-конфигурация для таких задач, как настройка заданий Jenkins. С системными свойствами вы более гибки.

вот и все.