2010-10-31 20 views
9

¿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

6

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().

+0

Si bien esta es la forma más poderosa (+1), sugeriría el modo maven estándar como lo sugiere pascal (también +1). –

+0

Consulte la respuesta de [nedruod's] (http://stackoverflow.com/a/9024779/14731) si tiene algún problema con esta solución. – Gili

+0

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). –

2

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.

+0

¿me puede dar algún código de ejemplo? – Gili

+0

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

2

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.

Cuestiones relacionadas