1. Introducción
En este artículo rápido, nos centraremos en empaquetar un proyecto de Maven en un archivo Jar ejecutable .
Por lo general, al crear un archivo jar , queremos ejecutarlo fácilmente, sin usar el IDE; con ese fin, discutiremos la configuración y los pros / contras de usar cada uno de estos enfoques para crear el ejecutable.
2. Configuración
Para crear un jar ejecutable , no necesitamos ninguna dependencia adicional. Solo necesitamos crear el proyecto Java de Maven y tener al menos una clase con el método main (…) .
En nuestro ejemplo, creamos una clase Java llamada ExecutableMavenJar.
También debemos asegurarnos de que nuestro pom.xml contenga los siguientes elementos:
4.0.0 com.baeldung core-java 0.1.0-SNAPSHOT jar
El aspecto más importante aquí es el tipo: para crear un jar ejecutable , verifique que la configuración use un tipo jar .
Ahora podemos empezar a utilizar las distintas soluciones.
2.1. Configuración manual
Comencemos con un enfoque manual, con la ayuda del complemento maven-dependency-plugin .
Primero, copiaremos todas las dependencias requeridas en la carpeta que especificaremos:
org.apache.maven.plugins maven-dependency-plugin copy-dependencies prepare-package copy-dependencies ${project.build.directory}/libs
Hay dos aspectos importantes a tener en cuenta. Primero, especificamos las dependencias de copia del objetivo , lo que le dice a Maven que copie estas dependencias en el directorio de salida especificado .
En nuestro caso, crearemos una carpeta llamada libs , dentro del directorio de construcción del proyecto (que suele ser la carpeta de destino ).
En el segundo paso, vamos a crear ejecutable y clase ruta conscientes frasco , con el enlace a las dependencias copiados en el primer paso:
org.apache.maven.plugins maven-jar-plugin true libs/ com.baeldung.executable.ExecutableMavenJar
La parte más importante de lo mencionado anteriormente es la configuración del manifiesto . Agregamos una ruta de clase , con todas las dependencias (carpeta libs / ), y proporcionamos la información sobre la clase principal.
Tenga en cuenta que debemos proporcionar un nombre completo de la clase, lo que significa que incluirá el nombre del paquete.
Las ventajas y desventajas de este enfoque son:
- pros - proceso transparente, donde podemos especificar cada paso
- contras : manual, las dependencias están fuera del jar final , lo que significa que su jar ejecutable solo se ejecutará si la carpeta libs será accesible y visible para un jar
2.2. Complemento de ensamblaje de Apache Maven
El complemento de ensamblaje Apache Maven permite a los usuarios agregar la salida del proyecto junto con sus dependencias, módulos, documentación del sitio y otros archivos en un solo paquete ejecutable.
El objetivo principal en el complemento de ensamblado es el objetivo único : se utiliza para crear todos los ensamblajes (todos los demás objetivos están obsoletos y se eliminarán en una versión futura).
Echemos un vistazo a la configuración en pom.xml :
org.apache.maven.plugins maven-assembly-plugin package single com.baeldung.executable.ExecutableMavenJar jar-with-dependencies
De manera similar al enfoque manual, necesitamos proporcionar la información sobre la clase principal; la diferencia es que el complemento de ensamblaje de Maven copiará automáticamente todas las dependencias necesarias en un archivo jar .
En la parte descriptorRefs del código de configuración, proporcionamos el nombre, que se agregará al nombre del proyecto.
La salida de nuestro ejemplo se denominará core-java-jar-with-dependencies.jar.
- pros : dependencias dentro del archivo jar , solo un archivo
- contras : control básico de empaquetar su artefacto, por ejemplo, no hay soporte de reubicación de clases
2.3. Complemento Apache Maven Shade
Apache Maven Shade Plugin proporciona la capacidad de empaquetar el artefacto en un uber-jar , que consta de todas las dependencias necesarias para ejecutar el proyecto. Además, admite el sombreado, es decir, cambiar el nombre de los paquetes de algunas de las dependencias.
Echemos un vistazo a la configuración:
org.apache.maven.plugins maven-shade-plugin shade true com.baeldung.executable.ExecutableMavenJar
Hay tres partes principales de esta configuración:
Primero, marca todas las dependencias que se empaquetarán en el tarro .
En segundo lugar, necesitamos especificar la implementación del transformador; usamos el estándar en nuestro ejemplo.
Finalmente, necesitamos especificar la clase principal de nuestra aplicación.
El archivo de salida se llamará core-java-0.1.0-SNAPSHOT-shaded.jar , donde core-java es el nombre de nuestro proyecto, seguido de la versión de la instantánea y el nombre del complemento.
- pros : dependencias dentro del archivo jar , control avanzado del empaquetado de su artefacto, con sombreado y reubicación de clases
- contras : configuración compleja (especialmente si queremos utilizar funciones avanzadas)
2.4. Complemento One Jar Maven
Otra opción para crear jar ejecutable es el proyecto One Jar.
Esto proporciona un cargador de clases personalizado que sabe cómo cargar clases y recursos desde archivos jar dentro de un archivo, en lugar de desde archivos jar en el sistema de archivos.
Echemos un vistazo a la configuración:
com.jolira onejar-maven-plugin org.baeldung.executable. ExecutableMavenJar true ${project.build.finalName}.${project.packaging} one-jar
Como se muestra en la configuración, necesitamos especificar la clase principal y adjuntar todas las dependencias para construir, usando attachToBuild = true .
Also, we should provide the output filename. Moreover, the goal for Maven is one-jar. Please note, that One Jar is a commercial solution, that will make dependency jars not expanded into the filesystem at runtime.
- pros – clean delegation model, allows classes to be at the top-level of the One Jar, supports external jars and can support Native libraries
- cons – not actively supported since 2012
2.5. Spring Boot Maven Plugin
Finally, the last solution we'll look at is the Spring Boot Maven Plugin.
This allows to package executable jar or war archives and run an application “in-place”.
To use it we need to use at least Maven version 3.2. The detailed description is available here.
Let's have a look at the config:
org.springframework.boot spring-boot-maven-plugin repackage spring-boot com.baeldung.executable.ExecutableMavenJar
There are two differences between Spring plugin and the others. First, the goal of the execution is called repackage, and the classifier is named spring-boot.
Please note, that we don't need to have Spring Boot application in order to use this plugin.
- pros – dependencies inside a jar file, you can run it in every accessible location, advanced control of packaging your artifact, with excluding dependencies from the jar file etc., packaging of war files as well
- cons – adds potentially unnecessary Spring and Spring Boot related classes
2.6. Web Application With Executable Tomcat
In the last part, we want to cover the topic of having a standalone web application, that is packed inside a jar file. In order to do that, we need to use different plugin, designed for creating executable jar files:
org.apache.tomcat.maven tomcat7-maven-plugin 2.0 tomcat-run exec-war-only package / false webapp.jar utf-8
The goal is set as exec-war-only, path to your server is specified inside configuration tag, with additional properties, like finalName, charset etc. To build a jar, run man package, which will result in creating webapp.jar in your target directory. To run
To run the application, just write this in your console: java -jar target/webapp.jar and try to test it by specifying the localhost:8080/ in a browser.
- pros – having one file, easy to deploy and run
- cons – a size of the file is much larger, due to packing Tomcat embedded distribution inside a war file
Please note, that this is the latest version of this plugin, which supports Tomcat7 server. To avoid errors, please check that your dependency for Servlets has scope set as provided, otherwise, there will be a conflict at the runtime of executable jar:
javax.servlet javax.servlet-api provided
3. Conclusion
En este artículo, describimos muchas formas de crear un jar ejecutable con varios complementos de Maven.
La implementación completa de este tutorial se puede encontrar en este (jar ejecutable) y este (ejecutable war) proyectos de Github.
¿Cómo probar? Para compilar el proyecto en un jar ejecutable , ejecute Maven con el comando mvn clean package .
Con suerte, este artículo le brinda más información sobre el tema y encontrará su enfoque preferido según sus necesidades.
Una nota final rápida: asegúrese de que las licencias de los frascos que está agrupando no prohíban este tipo de operación. Generalmente, ese no será el caso, pero es algo que vale la pena considerar.