1.1 Lista de complementos para compilar en Maven

El ensamblaje en Maven se puede configurar de manera muy flexible. Los desarrolladores de Maven han creado especialmente docenas de complementos, con los cuales puede configurar varias compilaciones de manera muy flexible. Los más populares se muestran en la siguiente tabla:

enchufar Descripción
1 maven-compilador-complemento Administra la compilación de Java
2 maven-resources-plugin Controla la inclusión de recursos en un ensamblaje.
3 Complemento de fuente experta Controla si el código fuente está incluido en un ensamblado
4 Complemento de dependencia de maven Controla el proceso de copia de bibliotecas de dependencia
5 maven-jar-complemento Complemento para crear el archivo jar final
6 Complemento de war experto Complemento para crear el archivo de war final
7 maven-surefire-plugin Gestiona las ejecuciones de prueba
8 buildnumber-maven-complemento Genera un número de compilación

Cada complemento es interesante a su manera, pero tendremos que analizarlos todos. Comencemos con lo principal: el complemento de administración de compilación.

1.2 Complemento de compilación maven-compiler-plugin

El complemento más popular que le permite controlar la versión del compilador y se usa en casi todos los proyectos es el maven-compiler-plugin. Tiene configuraciones predeterminadas, pero en casi todos los proyectos deben configurarse nuevamente.

En la versión más simple, en el complemento, debe especificar la versión del código fuente de Java y la versión de la máquina Java bajo la cual se realiza el ensamblaje:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.2</version>
    <configuration>
        <source>1.11</source>
        <target>1.13</target>
        <encoding>UTF-8</encoding>
    </configuration>
</plugin>

En el ejemplo anterior, configuramos tres opciones del compilador de Java: source, targety encoding.

El parámetro sourcenos permite establecer la versión de Java para nuestras fuentes. El parámetro targetes la versión de la máquina Java bajo la cual desea compilar las clases. Si no se especifica ningún código o versión de la máquina Java, el valor predeterminado es 1.3

Finalmente, el parámetro encodingle permite especificar la codificación de archivos Java. Indicamos UTF-8. Ahora casi todas las fuentes se almacenan en UTF-8. Pero si no se especifica este parámetro, se seleccionará la codificación actual del sistema operativo. Para Windows, esta es la codificación Windows-1251.

También hay casos en los que la computadora de compilación tiene varias versiones de Java instaladas: para compilar diferentes módulos y/o diferentes proyectos. En este caso, JAVA_HOMEsolo se puede especificar en la variable la ruta a uno de ellos.

Además, existen diferentes implementaciones de la máquina Java: OpenJDK, OracleJDK, Amazon JDK. Y cuanto más grande es el proyecto, más compleja es su estructura. Pero puede establecer explícitamente la ruta al compilador javac para el complemento usando la etiqueta . Fue agregado específicamente para esta ocasión.

El complemento maven-compiler-plugintiene dos objetivos:

  • compiler:compile– compilación de fuentes, por defecto asociado con la fase de compilación
  • compiler:testCompile– compilación de pruebas, por defecto está asociado a la fase de prueba-compilación.

También puede especificar una lista de argumentos para pasar al compilador javac en la línea de comando:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.2</version>
    <configuration>
        <compilerArgs>
            <arg>-verbose</arg>
            <arg>-Xlint:all,-options,-path<arg>
        </compilerArgs>
    </configuration>
</plugin>

1.3 Complemento para crear un archivo jar maven-jar-plugin

Si desea crear su propia biblioteca jar con Maven, necesitará el complemento maven-jar. Este complemento hace muchas cosas útiles.

Un ejemplo de tal complemento:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.4</version>
    <configuration>
        <includes>
            <include>**/properties/*</include>
        </includes>
        <archive>
           <manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile>
        </archive>
    </configuration>
</plugin>

Primero, se puede usar para especificar qué archivos irán a la biblioteca y cuáles no. Usando etiquetas <include>en la sección, <includes>puede especificar una lista de directorios cuyo contenido debe agregarse a la biblioteca .

En segundo lugar, cada jar debe tener un manifiesto ( archivo MANIFEST.MF ). El complemento en sí lo colocará en el lugar correcto en la biblioteca, solo necesita especificar qué ruta tomar. La etiqueta se utiliza para esto <manifestFile>.

Finalmente, el complemento puede generar un manifiesto por sí solo. Para hacer esto, en lugar de una etiqueta, <manifestFile>debe agregar una etiqueta <manifest>y especificar datos para el manifiesto futuro en ella. Ejemplo:

<configuration>
    <archive>
        <manifest>
            <addClasspath>true</addClasspath>
            <classpathPrefix>lib/</classpathPrefix>
            <mainClass>com.codegym.MainApplication</mainClass>
        </manifest>
    </archive>
</configuration>

La etiqueta <addClasspath>especifica si se debe agregar al manifiesto CLASSPATH.

La etiqueta <classpathPrefix>le permite agregar un prefijo (en la biblioteca de ejemplo) antes de cada recurso. Especificar un prefijo en <classpathPrefix>le permite colocar dependencias en una carpeta separada.

Sí, puede colocar bibliotecas dentro de otra biblioteca. Y hay muchas sorpresas esperándote cuando necesites pasar la ruta al archivo de propiedades en alguna parte, que está en la biblioteca jar, que está en la biblioteca jar.

Finalmente, la etiqueta <mainClass>apunta a la clase ejecutable principal. “¿Cuál es la clase ejecutable principal? ", - usted pregunta. Y es que una máquina Java puede ejecutar un programa especificado no solo por una clase Java, sino también por un archivo jar. Y es para este caso que se necesita la clase inicial principal.

1.4 Complemento de generación de números de compilación buildnumber-maven-plugin

Muy a menudo, las bibliotecas jar y los archivos war incluyen información con el nombre del proyecto y su versión, así como la versión del ensamblado. Esto no solo es útil para administrar dependencias, sino que también simplifica las pruebas: está claro en qué versión de la biblioteca se corrige el error y en cuál se agrega.

La mayoría de las veces, esta tarea se resuelve así: crean un archivo especial application.propertiesque contiene toda la información necesaria y lo incluyen en el ensamblaje. También puede configurar el script de compilación para que los datos de este archivo migren a MANIFEST.MFetc.

Pero lo más interesante es que Maven tiene un complemento especial que puede generar dicho archivo application.properties. Para hacer esto, debe crear dicho archivo y llenarlo con plantillas de datos especiales. Ejemplo:

# application.properties
app.name=${pom.name}
app.version=${pom.version}
app.build=${buildNumber}

Los valores de los tres parámetros se sustituirán en la etapa de construcción.

Los parámetros pom.namey pom.versionse tomarán directamente de pom.xml. Y para generar un número de compilación único en Maven, hay un complemento especial: buildnumber-maven-plugin. Vea el ejemplo a continuación:

<packaging>war</packaging>
<version>1.0</version>
<plugins>
    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>buildnumber-maven-plugin</artifactId>
        <version>1.2</version>
        <executions>
            <execution>
                <phase>validate</phase>
                <goals>
                    <goal>create</goal>
                </goals>
            </execution>
        </executions>
        <configuration>
            <revisionOnScmFailure>true</revisionOnScmFailure>
            <format>{0}-{1,date,yyyyMMdd}</format>
            <items>
                 <item>${project.version}</item>
                 <item>timestamp</item>
            </items>
        </configuration>
    </plugin>
</plugins>

En el ejemplo anterior, suceden tres cosas importantes. En primer lugar, se especifica el propio complemento para configurar la versión del ensamblado . En segundo lugar, se especifica que se ejecutará durante la fase de validación (la primera fase) y generará un número de compilación: ${buildNumber}.

Y en tercer lugar, se indica el formato de este número de ensamblaje, que se pega en varias partes . Esta es la versión del proyecto project.versiony la hora actual proporcionada por la plantilla. El formato de la plantilla lo especifica la clase Java MessageFormat.