Строковые массивы как аргументы командной строки для плагина maven - PullRequest
18 голосов
/ 26 августа 2009

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

Как это:

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

Это можно использовать через POM следующим образом:

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

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

-Dargs={arg1, arg2}

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

Ответы [ 5 ]

10 голосов
/ 27 августа 2009

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

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

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

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

-Dlocales=enGB,frFR

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

-DaddArgs=arg1|arg2|arg3

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

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

7 голосов
/ 18 мая 2011

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

-DaddArgs = arg1, arg2, arg3

1 голос
/ 29 июля 2017

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

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

Вот ссылка: 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 = 512 м -XX: -HeapDumpOnOutOfMemoryError

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

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

Вот и все.

1 голос
/ 22 июня 2017

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

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

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

-Dyour.param=val1,val2

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

1 голос
/ 09 марта 2017

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

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

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

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

...