Ejemplo de application assembler maven plugin

De ChuWiki

El Application Assembler Maven Plugin es un plugin que permite generar de forma automática los script de arranque windows (.bat) y linux (.sh) para arrancar nuestra aplicación java, así como la estructura de directorios típica de una aplicación bin, lib, etc. Veamos lo básico de este plugin. Todo el código de ejemplo lo tienes en application-assembler

Configuración básica[editar]

En nuestro fichero pom.xml debemos añadir el plugin y algo de su configuración. El siguiente trozo muestra cómo.

    <build>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>appassembler-maven-plugin</artifactId>
                <version>2.1.0</version>
                <configuration>
                    <programs>
                        <program>
                            <mainClass>com.chuidiang.examples.application_assembler_example.App</mainClass>
                            <id>app</id>
                        </program>
                    </programs>
                </configuration>
            </plugin>
            ...
        </plugins>
   </build>

Básicamente añadir el plugin con su groupId, artifactId y versión. Luego le indicamos cual es la clase principal de nuestra aplicación y un identificador que queramos. Podemos añadir tantos <program> como queramos, cada uno con su propia clase principal dentro de nuestro proyecto y un identificador que queramos, pero distintos entre ellos.

Para ejecutarlo, el comando es

mvn package appassembler:assemble

Como resultado de este comando, en el directorio target/appassembler crea dos subdirectorios:

  • bin con los scripts de arranque de nuestra aplicación windows y linux.
  • repo con una estructura de repositorio maven por debajo con el jar de nuestra aplicación y los jar de los que dependamos con scope runtime.

Configurando la estructura de directorios[editar]

Lo habitual suele ser tener un directorio bin con los script, un directorio lib con nuestras librerías y un directorio etc o conf con nuestros ficheros de configuración. Esto no se parece a lo que nos ha generado el plugin. Afortunadamente, hay muchas opciones de configuración para ajustarlo a nuestro gusto. Veamos sólo algunas de ellas

  • repositoryName para indicar como queremos que se llame el directorio donde van las librerías. El valor por defecto es repo, que es el directorio que hemos visto. Podemos poner esta opción para que el directorio se llame lib
  • repositoryLayout para indicar cómo queremos que se guarden las librerías dentro del directorio repo (o lib ahora). Por defecto lo hace siguiendo una estructura de tipo repositorio de maven, es decir, subdirectorios con los nombres de los paquetes, subdirectorio con el nombre del artifactId, subdirectorio con la versión y ahí dentro el jar. Habitualmente en el directorio lib van todas las librerías sin estructuras raras de subdirectorios. Podemos poner esta configuración con el valor flat.
  • useAllProjectDependencies para indicar qué dependencias queremos que se incluyan en el directorio repo (o lib ahora). Por defecto sólo las de runtime. Poniendo a true esta opción, meterá todas las dependencias.
  • generateRepository si queremos que se genere o no el directorio repo (o lib ahora) con las dependencias. Por defecto es true. Pero si sólo nos interesa generar los scripts, podemos poner aquí false. Aunque no generemos el directorio repo, es importante configurar las otras opciones con como queramos que se genere el script. Si debe buscar las librerías en un directorio lib o un directorio repo, etc.
  • copyConfigurationDirectory si queremos que vayan también los ficheros de configuración. Por defecto esta propiedad es false, por lo que los ficheros de configuración no aparecen. Si la ponemos a true, se copiarán los ficheros de configuración que haya en src/main/config al directorio etc.

La configuración personalizada quedaría así

            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>appassembler-maven-plugin</artifactId>
                <version>2.1.0</version>
                <configuration>
                    <repositoryLayout>flat</repositoryLayout>
                    <repositoryName>lib</repositoryName>
                    <useAllProjectDependencies>true</useAllProjectDependencies>
                    <generateRepository>true</generateRepository>
                    <copyConfigurationDirectory>true</copyConfigurationDirectory>
                    <programs>
                        <program>
                            <mainClass>com.chuidiang.examples.application_assembler_example.App</mainClass>
                            <id>app</id>
                        </program>
                    </programs>
                </configuration>
            </plugin>

Con esta configuración y tras la ejecución tendremos tres directorios en target/appassemble

  • bin con los script windows y linux
  • lib con todos los jar de los que dependemos, incluido el de nuestra aplicación.
  • etc con todos los ficheros que tengamos en src/main/config

En appasssembler:assemble tienes el detalle de todas las opciones disponibles.