Maven-Verpackungsarten

1. Übersicht

Der Verpackungstyp ist ein wichtiger Aspekt jedes Maven-Projekts. Es gibt die Art des Artefakts an, das das Projekt erzeugt. Im Allgemeinen erzeugt ein Build ein Glas , einen Krieg , einen Pom oder eine andere ausführbare Datei.

Maven bietet viele Standardverpackungsarten und bietet auch die Flexibilität, eine benutzerdefinierte zu definieren.

In diesem Tutorial werden wir uns eingehend mit Maven-Verpackungstypen befassen. Zunächst betrachten wir die Build-Lebenszyklen in Maven. Anschließend werden die einzelnen Verpackungstypen, ihre Darstellung und ihre Auswirkungen auf den Projektlebenszyklus erläutert. Am Ende werden wir sehen, wie ein benutzerdefinierter Verpackungstyp definiert wird.

2. Standardverpackungstypen

Maven bietet viele Standardverpackungstypen , die einen umfassen Glas , Krieg , Ohr , pom , rar , ejb und maven-plugin . Jeder Verpackungstyp folgt einem Build-Lebenszyklus, der aus Phasen besteht. Normalerweise ist jede Phase eine Folge von Zielen und führt eine bestimmte Aufgabe aus.

Unterschiedliche Verpackungstypen können in einer bestimmten Phase unterschiedliche Ziele verfolgen. In der Paketphase des JAR- Verpackungstyps wird beispielsweise das JAR- Ziel des Maven-Jar-Plugins ausgeführt. Umgekehrt wird für ein Kriegsprojekt das Kriegsziel des Maven-War-Plugins in derselben Phase ausgeführt.

2.1. Krug

Java-Archiv - oder JAR - ist eine der beliebtesten Verpackungsarten. Projekte mit diesem Verpackungstyp erzeugen eine komprimierte Zip-Datei mit der Erweiterung .jar . Es kann reine Java-Klassen, Schnittstellen, Ressourcen und Metadatendateien enthalten.

Schauen wir uns zunächst einige der Standard-Ziel-zu-Build-Phasen-Bindungen für das Glas an :

  • Ressourcen: Ressourcen
  • Compiler: kompilieren
  • Ressourcen: testResources
  • Compiler: testCompile
  • todsicher: testen
  • Glas: Glas
  • installieren: installieren
  • Bereitstellen: Bereitstellen

Definieren wir unverzüglich den Verpackungstyp eines Glasprojekts :

jar

Wenn nichts angegeben wurde, geht Maven davon aus, dass der Verpackungstyp ein Glas ist.

2.2. Krieg

Einfach ausgedrückt enthält ein Webanwendungsarchiv - oder Krieg - alle Dateien, die sich auf eine Webanwendung beziehen. Es kann Java-Servlets, JSPs, HTML-Seiten, einen Bereitstellungsdeskriptor und zugehörige Ressourcen enthalten. Insgesamt hat der Krieg die gleichen Zielbindungen wie ein Glas , aber mit einer Ausnahme: Die Paketphase des Krieges hat ein anderes Ziel, nämlich den Krieg .

Ohne Zweifel sind Glas und Krieg die beliebtesten Verpackungstypen in der Java-Community. Ein detaillierter Unterschied zwischen diesen beiden könnte eine interessante Lektüre sein.

Definieren wir den Verpackungstyp einer Webanwendung:

war

Die anderen Verpackungstypen ejb , par und rar haben ebenfalls ähnliche Lebenszyklen, aber jeder hat ein anderes Verpackungsziel.

ejb:ejb or par:par or rar:rar

2.3. Ohr

Das Enterprise Application Archive - oder Ear - ist eine komprimierte Datei, die eine J2EE-Anwendung enthält. Es besteht aus einem oder mehreren Modulen, die entweder Webmodule (als War- Datei verpackt ) oder EJB-Module (als JAR- Datei verpackt ) oder beide sein können.

Anders ausgedrückt, das Ohr ist eine Obermenge von Jars und Wars und erfordert einen Anwendungsserver, um die Anwendung auszuführen, während War nur einen Webcontainer oder Webserver benötigt, um sie bereitzustellen. Die Aspekte, die einen Webserver von einem Anwendungsserver unterscheiden, und was diese beliebten Server in Java sind, sind wichtige Konzepte für einen Java-Entwickler.

Definieren wir die Standardzielbindungen für das Ohr :

  • ear: generate-application-xml
  • Ressourcen: Ressourcen
  • Ohr: Ohr
  • installieren: installieren
  • Bereitstellen: Bereitstellen

So können wir den Verpackungstyp solcher Projekte definieren:

ear

2.4. pom

Unter allen Verpackungsarten ist Pom die einfachste. Es hilft, Aggregatoren und übergeordnete Projekte zu erstellen.

Ein Aggregator- oder Multimodulprojekt setzt Submodule aus verschiedenen Quellen zusammen. Diese Submodule sind reguläre Maven-Projekte und folgen ihren eigenen Build-Lebenszyklen. Der Aggregator POM enthält alle Referenzen von Submodulen unter dem Modulelement .

In einem übergeordneten Projekt können Sie die Vererbungsbeziehung zwischen POMs definieren. Das übergeordnete POM teilt bestimmte Konfigurationen, Plugins und Abhängigkeiten zusammen mit ihren Versionen. Die meisten Elemente des übergeordneten Elements werden von seinen untergeordneten Elementen geerbt. Ausnahmen sind Artefakt-ID , Name und Voraussetzungen .

Weil keine Ressourcen zu verarbeiten und kein Code zu kompilieren oder zu testen sind. Daher generieren sich die Artefakte von POM-Projekten selbst anstelle einer ausführbaren Datei.

Definieren wir den Verpackungstyp eines Multi-Modul-Projekts:

pom

Solche Projekte haben den einfachsten Lebenszyklus, der nur aus zwei Schritten besteht: Installieren und Bereitstellen .

2.5. Maven-Plugin

Maven bietet eine Vielzahl nützlicher Plugins. Es kann jedoch Fälle geben, in denen Standard-Plugins nicht ausreichen. In diesem Fall bietet das Tool die Flexibilität, ein Maven-Plugin entsprechend den Projektanforderungen zu erstellen.

Um ein Plugin zu erstellen, legen Sie den Verpackungstyp des Projekts fest:

maven-plugin

Das Maven-Plugin hat einen ähnlichen Lebenszyklus wie der Lebenszyklus von jar , jedoch mit zwei Ausnahmen:

  • 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.

Abgesehen von all diesen Typen bietet Maven viele andere Verpackungstypen über externe Projekte und Plugins an. Beispielsweise sind nar (natives Archiv), swf und swc Verpackungstypen für Projekte, die Adobe Flash- und Flex-Inhalte erstellen. Für solche Projekte benötigen wir ein Plugin, das benutzerdefinierte Verpackungen definiert, und ein Repository, das das Plugin enthält.

4. Fazit

In diesem Artikel haben wir uns verschiedene in Maven verfügbare Verpackungstypen angesehen. Außerdem haben wir uns damit vertraut gemacht, was diese Typen darstellen und wie sie sich in ihren Lebenszyklen unterscheiden. Am Ende haben wir auch gelernt, wie man einen benutzerdefinierten Verpackungstyp definiert und den Standard-Build-Lebenszyklus anpasst.

Alle Codebeispiele auf Baeldung werden mit Maven erstellt. Schauen Sie sich unbedingt unsere verschiedenen Maven-Konfigurationen über 0n GitHub an.