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

Я пишу плагин maven с параметром String [].

Вот так:

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

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

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

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

-Dargs={arg1, arg2}

Возможно ли это?

Ответы

Ответ 1

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

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

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

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

-Dlocales=enGB,frFR

scala -plugin:

-DaddArgs=arg1|arg2|arg3

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

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

Ответ 2

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

-DaddArgs = арг1, арг2, arg3

Ответ 3

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

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

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

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

Ответ 4

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

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

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

-Dyour.param=val1,val2

устанавливает список.

Ответ 5

Способ указания списка значений через системное свойство, для плагина зависит от того, насколько обновлен плагин.

Однако, если вы имеете дело с надлежащим обновленным плагином, который является актуальным, то правильный способ указания массива значений в плагин состоит из разделенных запятыми строк.

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

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

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

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

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

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

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

Вот и все.