Tipos de empaque de Maven

1. Información general

El tipo de empaque es un aspecto importante de cualquier proyecto de Maven. Especifica el tipo de artefacto que produce el proyecto. Generalmente, una compilación produce un jar , war , pom u otro ejecutable.

Maven ofrece muchos tipos de paquetes predeterminados y también brinda la flexibilidad de definir uno personalizado.

En este tutorial, profundizaremos en los tipos de empaque de Maven. Primero, veremos los ciclos de vida de compilación en Maven. Luego, discutiremos cada tipo de empaque, lo que representan y su efecto en el ciclo de vida del proyecto. Al final, veremos cómo definir un tipo de empaque personalizado.

2. Tipos de embalaje predeterminados

Maven ofrece muchos tipos de paquetes predeterminados que incluyen jar , war , ear , pom , rar , ejb y maven-plugin . Cada tipo de empaquetado sigue un ciclo de vida de compilación que consta de fases. Por lo general, cada fase es una secuencia de objetivos y realiza una tarea específica.

Los diferentes tipos de envases pueden tener un objetivo diferente en una fase particular. Por ejemplo, en la fase de paquete del tipo de empaquetado jar , se ejecuta el objetivo jar de maven-jar-plugin . Por el contrario, para un proyecto de guerra , el objetivo de guerra de maven-war-plugin se ejecuta en la misma fase.

2.1. tarro

El archivo Java, o jar , es uno de los tipos de paquetes más populares. Los proyectos con este tipo de empaquetado producen un archivo zip comprimido con la extensión .jar . Puede incluir clases, interfaces, recursos y archivos de metadatos de Java puro.

Para empezar, veamos algunos de los enlaces predeterminados del objetivo a la fase de compilación para el jar :

  • recursos: recursos
  • compilador: compilar
  • recursos: testResources
  • compilador: testCompile
  • infalible: prueba
  • jar: jar
  • instalar: instalar
  • implementar: implementar

Sin demora, definamos el tipo de empaquetado de un proyecto jar :

jar

Si no se ha especificado nada, Maven asume que el tipo de empaque es un frasco.

2.2. guerra

En pocas palabras, un archivo de aplicación web, o guerra , contiene todos los archivos relacionados con una aplicación web. Puede incluir servlets Java, JSP, páginas HTML, un descriptor de despliegue y recursos relacionados. En general, la guerra tiene los mismos objetivos que un frasco , pero con una excepción: la fase de paquete de la guerra tiene un objetivo diferente, que es la guerra .

Sin duda, jar y war son los tipos de empaque más populares en la comunidad Java. Una diferencia detallada entre estos dos podría ser una lectura interesante.

Definamos el tipo de empaquetado de una aplicación web:

war

Los otros tipos de paquetes ejb , par y rar también tienen ciclos de vida similares, pero cada uno tiene un objetivo de paquete diferente.

ejb:ejb or par:par or rar:rar

2.3. oreja

El archivo de aplicaciones empresariales, o ear , es un archivo comprimido que contiene una aplicación J2EE. Consiste en uno o más módulos que pueden ser módulos web (empaquetados como un archivo war ) o módulos EJB (empaquetados como un archivo jar ) o ambos.

Para decirlo de otra manera, el oído es un superconjunto de frascos y guerras y requiere un servidor de aplicaciones para ejecutar la aplicación, mientras que la guerra solo requiere un contenedor web o un servidor web para implementarlo. Los aspectos que distinguen a un servidor web de un servidor de aplicaciones, y cuáles son esos servidores populares en Java, son conceptos importantes para un desarrollador de Java.

Definamos los enlaces de objetivos predeterminados para el oído :

  • oído: generate-application-xml
  • recursos: recursos
  • oreja: oreja
  • instalar: instalar
  • implementar: implementar

Así es como podemos definir el tipo de empaque de dichos proyectos:

ear

2.4. pom

Entre todos los tipos de envases, pom es el más simple. Ayuda a crear agregadores y proyectos principales.

Un agregador o proyecto de varios módulos ensambla submódulos que provienen de diferentes fuentes. Estos submódulos son proyectos regulares de Maven y siguen sus propios ciclos de vida de construcción. El agregador POM tiene todas las referencias de submódulos bajo el elemento de módulos .

Un proyecto principal le permite definir la relación de herencia entre los POM. El POM principal comparte ciertas configuraciones, complementos y dependencias, junto con sus versiones. La mayoría de los elementos del padre son heredados por sus hijos; las excepciones incluyen artifactId , name y prerrequisitos .

Porque no hay recursos para procesar ni código para compilar o probar. Por lo tanto, los artefactos de los proyectos pom se generan a sí mismos en lugar de cualquier ejecutable.

Definamos el tipo de empaquetado de un proyecto de varios módulos:

pom

Estos proyectos tienen el ciclo de vida más simple que consta de solo dos pasos: instalar y desplegar .

2.5. maven-plugin

Maven ofrece una variedad de complementos útiles. Sin embargo, puede haber casos en los que los complementos predeterminados no sean suficientes. En este caso, la herramienta proporciona la flexibilidad para crear un complemento de maven, de acuerdo con las necesidades del proyecto.

Para crear un complemento, establezca el tipo de empaquetado del proyecto:

maven-plugin

El plugin maven tiene un ciclo de vida similar al ciclo de vida de jar , pero con dos excepciones:

  • plugin: descriptor is bound to the generate-resources phase
  • plugin: addPluginArtifactMetadata is added to the package phase

For this type of project, a maven-plugin-api dependency is required.

2.6. ejb

Enterprise Java Beans – or ejb – help to create scalable, distributed server-side applications. EJBs often provide the business logic of an application. A typical EJB architecture consists of three components: Enterprise Java Beans (EJBs), the EJB container, and an application server.

Now, let's define the packaging type of the EJB project:

ejb

The ejb packaging type also has a similar lifecycle as jar packaging, but with a different package goal. The package goal for this type of project is ejb:ejb.

The project, with ejb packaging type, requires a maven-ejb-plugin to execute lifecycle goals. Maven provides support for EJB 2 and 3. If no version is specified, then default version 2 is used.

2.7. rar

Resource adapter – or rar – is an archive file that serves as a valid format for the deployment of resource adapters to an application server. Basically, it is a system-level driver that connects a Java application to an enterprise information system (EIS).

Here's the declaration of packaging type for a resource adapter:

rar

Every resource adapter archive consists of two parts: a jar file that contains source code and a ra.xml that serves as a deployment descriptor.

Again, the lifecycle phases are the same as a jar or war packaging with one exception: Thepackage phase executes the rar goal that consists of a maven-rar-plugin to package the archives.

3. Other Packaging Types

So far, we've looked at various packaging types that Maven offers as default. Now, let's imagine we want our project to produce an artifact with a .zip extension. In this case, the default packaging types can't help us.

Maven also provides some more packaging types through plugins. With the help of these plugins, we can define a custom packaging type and its build lifecycle. Some of these types are:

  • msi
  • rpm
  • tar
  • tar.bz2
  • tar.gz
  • tbz
  • zip

To define a custom type, we have to define its packagingtype and phases in its lifecycle. For this, create a components.xml file under the src/main/resources/META-INF/plexus directory:

 org.apache.maven.lifecycle.mapping.LifecycleMapping zip org.apache.maven.lifecycle.mapping.DefaultLifecycleMapping   org.apache.maven.plugins:maven-resources-plugin:resources com.baeldung.maven.plugins:maven-zip-plugin:zip org.apache.maven.plugins:maven-install-plugin:install org.apache.maven.plugins:maven-deploy-plugin:deploy   

Until now, Maven doesn't know anything about our new packaging type and its lifecycle. To make it visible, let's add the plugin in the pom file of the project and set extensions to true:

  com.baeldung.maven.plugins maven-zip-plugin true  

Now, the project will be available for a scan, and the system will look into plugins and compnenets.xml file, too.

Aparte de todos estos tipos, Maven ofrece muchos otros tipos de paquetes a través de proyectos y complementos externos. Por ejemplo, nar (archivo nativo), swf y swc son tipos de empaquetado para los proyectos que producen contenido de Adobe Flash y Flex. Para tales proyectos, necesitamos un complemento que defina el empaquetado personalizado y un repositorio que contenga el complemento.

4. Conclusión

En este artículo, analizamos varios tipos de empaque disponibles en Maven. Además, nos familiarizamos con lo que representan estos tipos y cómo se diferencian en sus ciclos de vida. Al final, también aprendimos cómo definir un tipo de empaque personalizado y personalizar el ciclo de vida de compilación predeterminado.

Todos los ejemplos de código en Baeldung se crean con Maven. Asegúrese de revisar nuestras diversas configuraciones de Maven en GitHub.