Cómo escribir un complemento de Maven
Conceptos básicos
Qué hacer cuando las funciones integradas de Maven no pueden satisfacer las necesidades, entonces solo puede escribir complementos para ello. (Dicho esto, solo puedes escribir un complemento muy completo para la extensión Maven, no un simple script. Es realmente demasiado engorroso)
Hay muchos artículos sobre Maven en Internet, pero rara vez se publican. discutido. Y cómo escribir complementos para él. Incluso si busca el complemento maven, solo le devolverá un montón de artículos sobre cómo usar los complementos maven. Espero que este artículo pueda ayudar a algunos usuarios de Maven.
Supongo que ya sabes cómo usar maven. No publicaré el archivo pom.xml completo.
Primero, necesitas crear un proyecto de maven. es un proyecto especial de Maven y luego modifica el pom lt;maven.versiongt;2.2.1lt;/maven.versiongt;
lt;/propertiesgt;
Maven3 ha estado disponible. Hace mucho tiempo y es compatible con maven2, por lo que todo nuestro equipo usa Maven3 de manera uniforme, pero el complemento que escribí aquí es maven2, que se puede usar en maven2 y maven3 al mismo tiempo. Sin embargo, esta razón no es importante. La verdadera razón es que el código de maven3 es realmente malo. Al principio usé maven3 para escribirlo y descubrí que muchos de los códigos que contenía no tenían ningún comentario y muchos códigos habían sido abandonados. , pero no hubo una explicación clara de qué método utilizar para reemplazarlos. Al final, utilicé la API que Maven3 abandonó en Maven2 para completar mi función. Funcionó muy bien, pero a veces puede haber algunos recordatorios para usar la API que está a punto de ser abandonada.
Luego agregue dependenciaslt;dependenciesgt;
lt;dependencygt;lt;groupidgt;org.apache.mavenlt;/groupidgt;lt;artifactidgt;maven-plugin-apilt;/artifactidgt ; lt;versiongt;${maven.version}lt;/versiongt;
lt;/dependencygt;
lt;dependencygt; lt;groupidgt;org.apache.mavenlt;/ groupidgt ;lt;artifactidgt;maven-corelt;/artifactidgt;lt;versiongt;${maven.version}lt;/versiongt;
lt;/dependencygt;
lt;/ dependenciesgt ;
Luego comience a crear la clase Mojo. Cada función específica en el complemento de Maven es un Mojo. Por ejemplo, eclipse: clean y eclipse: eclipse son dos Mojo/**
*/
public?class?HelloWorldMojo?extends?AbstractMojo?{ public?void?execute()?throws?MojoExecutionException { getLog(). info ("¡Hola,? Mundo!"); }
}
Primero herede AbstractMojo e implemente el método ejecutar() Aquí es donde ingresa cada llamada y luego debe agregarse. en la clase Definido en Javadoc, este es un método de definición comúnmente utilizado antes de que apareciera la anotación (quizás Maven lo cambie a anotación en el futuro, lo que puede proporcionar verificación de compilación y verificación IDE).
Debemos definir @goal, que representa el objetivo en ejecución. En pocas palabras, el Mojo limpio en eclipse: clean se puede escribir en cualquier paquete.
De esta manera, completamos un complemento de Maven simple y luego lo hicimos. necesita una prueba simple para confirmar que se está ejecutando correctamente. Primero instálelo en el almacén local a través de maven install
Luego abra cualquier proyecto maven (por ejemplo, ya estamos usando el proyecto maven), en pom. agrega un complementolt;buildgt;lt;pluginsgt;
lt;plugingt;lt;groupidgt;xxxlt;/groupidgt; ejecucionesgt; /phasegt; lt;goalsgt;
lt;goalgt;helloWorldlt;/goalgt; lt;/goalsgt; p>
lt;/executionsgt;/executionsgt;
lt;/plugingt; lt;/pluginsgt;
lt;/buildgt;
A lo que se debe prestar atención es a la parte de fase que vinculamos este complemento a la compilación. ciclo y luego ejecutamos mvn compile, y podemos ver con éxito el resultado Hola y mundo (por supuesto, también puedes ejecutarlo directamente a través de la línea de comando, ¡debes traer el groupId y el artefactoId completos)
Inyección
Mojo es una clase de modelo Java Bean muy simple. Encontrarás que hay muy pocos métodos en AbstractMojo que Mojo hereda. Entonces, ¿qué debemos hacer si necesitamos obtener el contexto que se está ejecutando actualmente en Mojo.execute? La respuesta es la inyección, que es similar al IOC de primavera.
Hay dos tipos principales de inyecciones de uso común. La primera es la configuración adicional en la configuración xml. Por ejemplo, tenemos una configuración de complemento de este tipo lt;artifactidgt; maven -eclipse-pluginlt;/artifactidgt; lt;configurationgt; lt;downloadsourcesgt;truelt;/downloadsourcesgt; lt;/configurationgt; p > lt;/plugingt; Todas las propiedades escritas en la configuración se pueden inyectar en Mojo, por ejemplo, el siguiente código /** *?@parameter */ private?boolean?downloadSources; Puede obtener el valor en la configuración a través de la variable downloadSources. Vale la pena señalar que no es necesario generar un get/set completo en modo JavaBean, y privado es válido. También puede agregar otros atributos al javadoc, como /** *?@parameter?default-value="true" *?@readonly */ private?boolean ?downloadSources; El valor predeterminado es verdadero y no se puede modificar mediante la configuración (por supuesto, definitivamente no tendremos tal requisito aquí. Para obtener más javadoc, consulte las instrucciones en la documentación oficial<). /p> El segundo tipo de datos de inyección es el contexto, que es diferente de HttpServlet.getServletContext. Si necesitamos el contexto del tiempo de ejecución de Mojo, también se obtiene mediante inyección /** *?@parameter?expression="$ {proyecto}" *?@readonly */ privado?MavenProject?project; /** *?@component *?@readonly */ private?ArtifactFactory?artifactFactory; Por ejemplo, aquí podemos obtener ArtifactFactory y MavenProject. Cabe señalar que aquí puede haber dos métodos. El primero es similar al método obtenido mediante la configuración xml. especifique el nombre mediante expresión. De hecho, también puede usar $ en xml. {project}Obtenga las cosas correspondientes y realice algunas operaciones simples (por supuesto, solo puede haber descripciones de texto en xml, aquí hay una clase)
La otra forma es utilizar la anotación @component para obtener algunas instancias de componentes básicos.
Pruebas
Después de escribir un complemento, debemos probarlo. Si utilizamos pruebas manuales, será muy problemático, porque el proceso de lanzamiento del complemento Maven. En sí mismo es muy complicado. Debe compilar y empaquetar su complemento Maven, luego instalarlo en una biblioteca local (o una biblioteca privada remota), luego escribir un proyecto de muestra y luego ejecutarlo para ver si es correcto. Por supuesto, también puede utilizar las pruebas unitarias para resolver algunos problemas, pero las pruebas unitarias son difíciles de garantizar que el complemento sea finalmente correcto, y los complementos de Maven a menudo manejan archivos
Aquí debemos Realice pruebas de integración automatizadas del complemento Maven. El ciclo de vida de Maven incluye pruebas de integración y no hay ninguna función vinculante.
Pero si busca en Google, encontrará algunos ejemplos de pruebas de integración de Maven, que consisten aproximadamente en iniciar Jetty, luego verificar a través del acceso http y luego cerrar Jetty.
Lo que usamos aquí es maven-invoker-plugin, que es para pruebas de integración de complementos de Maven
Primero agregue lt;buildgt;
lt;pluginsgt;
lt;plugingt;
lt;artifactidgt;maven-invoker-pluginlt;/artifactidgt;
lt;configurationgt;
lt;cloneprojectstogt;${project.build.directory}/itlt /cloneprojectstogt; ;
lt;/configurationgt;
lt;executionsgt;
lt;executiongt;
lt;idgt;integration-testlt; /idgt;
lt;goalsgt;
lt;goalgt;installlt;/goalgt;
lt;goalgt;runlt;/goalgt;
p>
lt;/goalsgt;
lt;/executiongt;
lt;/executionsgt;
lt;/plugingt;
lt;/pluginsgt;
lt;/buildgt;
cloneProjectsTo es copiar el caso de prueba primero y luego ejecutar la sección de ejecución La configuración de maven. -invoker-plugin son Los dos objetivos están vinculados a la prueba de integración. El ciclo de vida de la prueba de integración se llamará antes de la instalación de mvn.
El contenido de la prueba de integración se coloca en el directorio src/it. Cada nuevo directorio representa una prueba independiente. Coloque un proyecto maven completo en él. Por supuesto, debe introducir el complemento maven que escribió y ejecutarlo en este proyecto. También necesita un archivo postbuild.groovy. en el directorio raíz del caso de prueba. El propósito de este script es verificar después de ejecutar si el proyecto maven logra los resultados que desea. Obviamente, puedes saber si está escrito en groovy mirando el nombre. Generalmente, verificaremos si se genera un determinado archivo, etc., y si es incorrecto, se generará una excepción.
Luego lo ejecutamos en el directorio de complementos de Maven. MVN Integration-Test puede realizar pruebas de integración