maven 2 - sts - ¿La mejor forma de acceder a la configuración en tiempo de ejecución de un plugin maven desde un mojo personalizado?
maven-eclipse-plugin (3)
No estoy seguro de cómo lo haría exactamente, pero me parece que esta podría no ser la mejor decisión de diseño. Si es posible, debe intentar desacoplar su Mojo de cualquier otro complemento.
En cambio, recomendaría usar propiedades personalizadas para descartar cualquier duplicación en la configuración de complementos separados.
Puede establecer una propiedad personalizada "foo" en su pom usando la sección de propiedades:
<project>
...
<properties>
<foo>value</foo>
</properties>
...
</project>
Ahora se puede acceder a la propiedad foo desde cualquier parte del pom mediante el signo de dólar + nota de llave:
<somePluginProperty>${foo}</somePluginProperty>
Estoy escribiendo un MOJO maven2 personalizado. Necesito acceder a la configuración en tiempo de ejecución de otro complemento, desde este MOJO.
¿Cuál es la mejor manera de hacer esto?
El uso de propiedades es, sin duda, una forma de hacerlo, pero no es ideal. Todavía requiere que el usuario defina $ {propertyName} en múltiples lugares en todo el pom. Quiero permitir que mi complemento funcione sin modificaciones en el pom del usuario, aparte de la definición del complemento en sí.
No veo el acceso a las propiedades de tiempo de ejecución de otro MOJO como un acoplamiento demasiado apretado. Si el otro MOJO se define en cualquier parte de la jerarquía de compilación, quiero que mi MOJO respete la misma configuración.
Mi solución actual es:
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;
}
/**
* Extracts nested values from the given config object into a List.
*
* @param childname the name of the first subelement that contains the list
* @param config the actual config object
*/
private List extractNestedStrings(String childname, Xpp3Dom config) {
final Xpp3Dom subelement = config.getChild(childname);
if (subelement != null) {
List result = new LinkedList();
final Xpp3Dom[] children = subelement.getChildren();
for (int i = 0; i < children.length; i++) {
final Xpp3Dom child = children[i];
result.add(child.getValue());
}
getLog().info("Extracted strings: " + result);
return result;
}
return null;
}
Esto ha funcionado para las pocas construcciones pequeñas con las que he probado. Incluyendo una construcción de múltiples módulos.
Puede obtener una lista de complementos actualmente utilizados en la compilación siguiendo los pasos a continuación:
Primero necesitas que Maven inyecte el proyecto actual en tu mojo, usas la variable de clase definida a continuación para obtener esto.
/**
* The maven project.
*
* @parameter expression="${project}"
* @readonly
*/
private MavenProject project;
Luego puede usar lo siguiente para obtener una lista de los complementos utilizados en esta compilación.
mavenProject.getBuildPlugins()
Puede repetir esta lista hasta que encuentre el complemento desde el que desea extraer la configuración.
Finalmente, puede obtener la configuración como Xpp3Dom.
plugin.getConfiguration()
Nota: Si altera la configuración de otros complementos (en lugar de simplemente extraer información), solo se modificará para la fase actual y no para las fases posteriores.