¿Cómo programo un Mojo para establecer la configuración de otro Mojo? Por ejemplo: Mojo A requiere que se defina el parámetro de configuración A.foo
. Un usuario puede especificar A.foo
manualmente o ejecutar el complemento B que calculará el valor para él/ella.Maven: cómo pasar parámetros entre Mojos?
Respuesta
responder a mi propia pregunta:
Es posible acceder a las propiedades de configuración o de todo el proyecto de un plugin en tiempo de ejecución utilizando un MavenProject
ejemplo:
/**
* The maven project.
*
* @parameter expression="${project}"
* @readonly
*/
private MavenProject project;
A continuación, puede acceder a la configuración de un plugin en tiempo de ejecución:
private Plugin lookupPlugin(String key)
{
List plugins = getProject().getBuildPlugins();
for (Iterator iterator = plugins.iterator(); iterator.hasNext();)
{
Plugin plugin = (Plugin) iterator.next();
if(key.equalsIgnoreCase(plugin.getKey()))
return plugin;
}
return null;
}
...
Xpp3Dom configuration = (Xpp3Dom) Plugin.getConfiguration()
configuration.getChild("parameterName"); // get parameter
configuration.addChild(new Xpp3Dom("parameterName")); // add parameter
...
Nota: Cualquier cambio de configuración se descarta al final de la fase actual.
Fuente: Best way to access the runtime configuration of a maven plugin from a custom mojo?
Alternativamente, usted puede obtener/establecer los parámetros de todo el proyecto utilizando MavenProject.getProperties()
.
Supongo que la manera más fácil sería establecer una propiedad en el primer Mojo y acceder a él desde el otro Mojo.
¿me puede dar algún código de ejemplo? – Gili
Las pruebas muestran que esto no funciona. Los reemplazos de propiedades como ese se resuelven en sus valores literales antes de que se ejecute alguno de los complementos (creo que es en el momento en que se crea el POM efectivo). Lo que sí funciona es si el plugin con el que está tratando de comunicarse tiene una "expresión" definida para su parámetro porque la evaluación de esos se retrasa más ... pero para algo lo coloca en su POM en la sección de configuración de un POM, modificación mientras ejecuta otro plugin es demasiado tarde. – nedruod
Esto resulta ser una tarea complicada debido principalmente al tiempo de "configuración" de los complementos por el tiempo de ejecución de Maven. Cambiar la "configuración" de getBuildPlugins generalmente no va a funcionar.
El mejor método es el valor predeterminado si está escribiendo el complemento de destino; de lo contrario, use las propiedades.
Con propiedades, pero tiene que tener cuidado con el uso de las propiedades. La precaución es darse cuenta de que si su POM (o cualquier padre) define un valor para una propiedad, entonces la referencia de $ {property} se reemplazará cuando se cargue el POM. Sin embargo, si no hay una propiedad de "propiedad", la referencia de $ {property} permanece y solo se reemplaza por un valor nulo en el último momento posible.
"valor-predeterminado" también se evalúa en el último momento posible, y creo que esta es una solución más segura porque hay una razón lógica por la que debe evaluarse en el último momento posible, donde-como el inexistente la propiedad puede ser solo un detalle de implementación que podría cambiar en futuras versiones de Maven.
En mi caso tuve que recurrir a las propiedades porque quería controlar el "classesDirectory" del plugin surefire. Quería que siguiera el valor predeterminado de $ {project.build.outputDirectory} cuando Cobertura no se ejecutó, pero cuando se ejecutó Cobertura quise que usara $ {project.build.outputDirectory}/generated-classes/cobertura.
Definir en su sección de plugins:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire-plugin.version}</version>
<configuration>
<classesDirectory>${instrumentedClassesDirectory}</classesDirectory>
</configuration>
</plugin>
Luego, en el plug-in "fuente":
getProject().getProperties().put("instrumentedClassesDirectory", coberturaDir);
Y asegúrese de que en ningún caso haya puesto algo como lo siguiente en cualquier POM:
<properties>
<instrumentedClassesDirectory>${project.build.outputDirectory}</instrumentedClassesDirectory>
</properties>
porque, si lo hace, aunque el valor de la propiedad esté establecido por su complemento de origen, r El complemento de destino no verá el valor.Puede ignorar esta última advertencia si el uso de una propiedad pasa al valor predeterminado del complemento de origen, pero como dije en mi caso, eso no funcionaría porque no quería cambiar el valor de project.build.outputDirectory.
- 1. ¿Cómo pasar valores (parámetros) entre páginas XAML?
- 2. Pasar parámetros entre las plantillas de velocidad
- 3. Pasar parámetros entre formularios en MS Access
- 4. Android: pasar parámetros entre las clases
- 5. Cómo pasar operadores como parámetros
- 6. Maven - pasar argumento para usar en exec-maven-plugin
- 7. ¿Pasar parámetros con call_user_func?
- 8. Cómo pasar múltiples parámetros a Eval()?
- 9. ¿Cómo pasar los parámetros a XSLT?
- 10. Symfony2: Cómo pasar parámetros para formar colecciones
- 11. ¿Cómo pasar parámetros dinámicos en Powershell?
- 12. ¿Cómo pasar parámetros a un constructor?
- 13. Cómo pasar parámetros int en Sql commandText
- 14. cómo pasar múltiples parámetros para rake tarea
- 15. Marionette.CompositeView, cómo pasar parámetros a Marionette.ItemView
- 16. ¿Cómo pasar parámetros de URL a JSF?
- 17. ¿Cómo pasar parámetros a la clase anónima?
- 18. asp.net webapi: cómo pasar parámetros opcionales?
- 19. Cómo pasar parámetros a una vista
- 20. Pasar parámetros en rails redirect_to
- 21. Cómo enviar parámetros entre viewmodels usando viewmodellocator
- 22. Delphi- pasar parámetros a ADOquery
- 23. Pasar los parámetros a psql.exe
- 24. ¿Cómo pasar parámetros a la función llamada por ElapsedEventHandler?
- 25. Struts 2: parámetros entre Acciones
- 26. Pasar parámetros para asignar funciones en CouchDb
- 27. Java Maven MOJO - obteniendo información del proyecto POM
- 28. Pasar parámetros en vistas parciales - MVC3/Razor
- 29. pasar parámetros rastrillo para tareas dependientes
- 30. Al pasar parámetros a CanCan en RoR
Si bien esta es la forma más poderosa (+1), sugeriría el modo maven estándar como lo sugiere pascal (también +1). –
Consulte la respuesta de [nedruod's] (http://stackoverflow.com/a/9024779/14731) si tiene algún problema con esta solución. – Gili
Hola, ¿se puede usar esto realmente para pasar cosas entre Mojos? Intenté esta solución modificando la configuración del objetivo Mojo de mi Mojo. Nunca puede obtener la configuración agregada cuando se ejecuta (en la misma fase). –