maven 2 - plugin - Cadenas de cadenas como argumentos de línea de comando para el complemento de Maven
maven-resources-plugin (5)
Estoy escribiendo un complemento de Maven que tiene un parámetro que es una cadena [].
Me gusta esto:
/**
* @parameter expression="${args}"
*/
protected String[] args;
Esto se puede utilizar a través del POM así:
<args>
<arg>arg1</arg>
<arg>arg2</arg>
<args>
Pero quiero enviarlo desde la línea de comandos.
-Dargs={arg1, arg2}
es posible?
De acuerdo con el blog de Sonatype here , si usted es un desarrollador de complementos y
- usar Maven 3
y anote su parámetro de complemento de tipo de matriz / colección usando anotación como:
/** @parameter expression="${args}" */
De esta manera, Maven puede procesar el parámetro del complemento automáticamente y los usuarios del complemento pueden proporcionar los parámetros del tipo de matriz / colección del complemento a través de CLI usando una propiedad del sistema separada por comas como mvn myplugin:mygoal -Dargs=a,b,c
El último experto (3.0.3) debería trabajar con:
-DaddArgs = arg1, arg2, arg3
La forma de especificar una lista de valores a través de la propiedad del sistema, para un complemento, depende de qué tan actualizado esté el complemento.
Sin embargo, si está tratando con un complemento implementado que está actualizado, entonces la manera correcta de especificar una matriz de valores en un complemento es a través de cadenas separadas por comas.
Aquí hay una referencia: here
Aquí hay una cita de la referencia:
Para muchos parámetros de complementos, en ocasiones es conveniente especificar sus valores desde la línea de comandos a través de las propiedades del sistema. En el pasado, esto se limitaba a parámetros de tipos simples como String o Boolean. La última versión de Maven finalmente permite a los usuarios de complementos configurar colecciones o arreglos desde la línea de comandos a través de cadenas separadas por comas. Tomemos por ejemplo un parámetro de complemento como este:
Yendo un poco más lejos, podemos ver un ejemplo más concreto. Consideremos, el plugin de Wildfly maven. Este complemento tiene una propiedad de configuración en desuso llamada: jvmArgs.
Se esperaba que esto se pasara como una lista de valores separados por espacios. Como todos sabemos, en la línea de comandos, jugar con los espacios no es adorable. Entonces, si observamos la definición de este parámetro en el código mojo del complemento, encontrará algo como esto (aquí va otra cita).
/**
* A space delimited list of JVM arguments.
*
* @deprecated use {@link #javaOpts}
*/
@Parameter(alias = "jvm-args", property = PropertyNames.JVM_ARGS)
@Deprecated
private String jvmArgs;
Así que esta es la vieja forma de hacer las cosas.
Ahora, si está utilizando la última versión de este complemento (por ejemplo, Alpha6). Entonces el código fuente tendrá un nuevo campo agradable llamado javaOpts. Veamos cómo se ve el campo en el código.
/**
* The JVM options to use.
*/
@Parameter(alias = "java-opts", property = PropertyNames.JAVA_OPTS)
private String[] javaOpts;
Entonces, lo que vemos es que tenemos un campo de matriz agradable en el StartMojo. Este campo de matriz está debidamente anotado. Y el motor de Maven hará el trabajo pesado de establecer los valores en el Mojo.
Cuando desee bombear datos en este campo a través de la línea de comando, en su archivo por lotes debe especificar algo del formulario:
-Dwildfly.javaOpts="-Xmx1536M,-Xms1536M,-XX:MaxMetaspaceSize=512M,-XX:-HeapDumpOnOutOfMemoryError"
Si intentas el samething usando sapces en lugar de commans. Te mostraré lo que pasa:
[INFO] Se está iniciando el servidor STANDALONE. Tamaño máximo no válido de almacenamiento dinámico: -Xmx1536M -XX: MaxMetaspaceSize = 512m -XX: -HeapDumpOnOutOfMemoryError
Así que ya ve, maven cuando se tragó la propiedad de mi sistema llena de espacios, no hizo una división de cadena. Así que Wildfly intentó configurar los ajustes de la memoria jvm como si la memoria máxima fuera la cadena completa. Por otro lado, cuando uso comas para separarlo, Mojo se enriquece adecuadamente y puedo controlar la configuración de memoria del servidor de aplicaciones cuando se inicia.
Y, por supuesto, desea utilizar las propiedades del sistema y no la configuración XML de pom.xml, para tareas como la configuración de trabajos de Jenkins. Con las propiedades del sistema eres bastante más flexible.
Eso es.
No puede hacerlo directamente por lo que sé, pero es una práctica bastante común aceptar una Cadena delimitada y dividirla en una matriz.
Por ejemplo, el maven-site-plugin permite especificar una cadena de locales delimitada por comas, mientras que el maven-scala-plugin maneja esto al permitirle definir los argumentos con un separador de tuberías. Puedes mirar los Mojos relevantes para ver cómo se procesa el argumento.
Algunos ejemplos de uso a continuación:
sitio-plugin:
-Dlocales=enGB,frFR
plugin de scala
-DaddArgs=arg1|arg2|arg3
Actualización: si desea manejar esto de manera más elegante, puede usar maven-shared-io para permitir la definición de un archivo descriptor externo, luego pasar la ubicación del descriptor como una propiedad. Esto significa que un solo argumento de línea de comando puede hacer referencia a una estructura de configuración.
Si esto le parece que podría funcionar para usted, eche un vistazo a esta answer que describe cómo usar descriptores externos en el complemento de propiedades, o esta answer que es similar para el complemento de xml-maven. O simplemente puede mirar el ensamblado de ensamblaje para obtener ideas.
Para actualizar un poco la respuesta de @ybon, parece
@Parameter(property="your.param")
private List<String> yourParam;
Funciona, al menos cuando se usan maven-plugin-annotations:3.5
en Maven 3.5.0. Corriendo con
-Dyour.param=val1,val2
establece la lista.