Sådan oprettes en eksekverbar JAR med Maven

1. Introduktion

I denne hurtige artikel vil vi fokusere på emballering af et Maven-projekt i en eksekverbar Jar-fil.

Normalt når du opretter en krukke fil, vi ønsker at udføre den let uden brug af IDE; med henblik herpå vil vi diskutere konfigurationen og fordele / ulemper ved at bruge hver af disse tilgange til oprettelse af den eksekverbare.

2. Konfiguration

For at oprette en eksekverbar krukke, vi har ikke brug for yderligere afhængigheder. Vi skal bare oprette Maven Java-projekt og have mindst en klasse med hoved (...) metode.

I vores eksempel oprettede vi Java-klasse med navnet ExecutableMavenJar.

Vi er også nødt til at sikre, at vores pom.xml indeholder følgende elementer:

4.0.0 com.baeldung core-java 0.1.0-SNAPSHOT jar

Det vigtigste aspekt her er typen - at oprette en eksekverbar krukke, dobbelttjek konfigurationen bruger en krukke type.

Nu kan vi begynde at bruge de forskellige løsninger.

2.1. Manuel konfiguration

Lad os starte med en manuel tilgang - ved hjælp af maven-afhængigheds-plugin.

Først kopierer vi alle nødvendige afhængigheder til den mappe, som vi specificerer:

 org.apache.maven.plugins maven-afhængighed-plugin kopi-afhængigheder forberede-pakke kopi-afhængigheder $ {project.build.directory} / libs 

Der er to vigtige aspekter at bemærke. Først angiver vi målet kopi-afhængigheder, som beder Maven om at kopiere disse afhængigheder til det angivne outputDirectory.

I vores tilfælde opretter vi en mappe med navnet libs, inde i projektbygningsmappen (som normalt er mål folder).

I det andet trin skal vi skabe eksekverbar og klassesti-bevidst krukke, med linket til de afhængigheder, der blev kopieret i det første trin:

 org.apache.maven.plugins maven-jar-plugin true libs / com.baeldung.executable.ExecutableMavenJar 

Den vigtigste del af ovennævnte er manifest konfiguration. Vi tilføjer en klassesti med alle afhængigheder (mappe libs /) og give oplysninger om hovedklassen.

Bemærk, at vi skal angive fuldt kvalificerede navngivne af klassen, hvilket betyder, at det inkluderer pakkenavn.

Fordele og ulemper ved denne tilgang er:

  • fordele - gennemsigtig proces, hvor vi kan specificere hvert trin
  • ulemper - manuel, afhængigheder er ude af finalen krukke, hvilket betyder, at din eksekverbare krukke kører kun, hvis libs mappen vil være tilgængelig og synlig for en krukke

2.2. Apache Maven Assembly Plugin

Apache Maven Assembly Plugin giver brugerne mulighed for at samle projektudgangen sammen med dens afhængigheder, moduler, webstedsdokumentation og andre filer i en enkelt pakke, der kan køres.

Hovedmålet i montageplugin er enkelt mål - bruges til at oprette alle samlinger (alle andre mål udfases og fjernes i en fremtidig frigivelse).

Lad os se på konfigurationen i pom.xml:

 org.apache.maven.plugins maven-assembly-plugin-pakke enkelt com.baeldung.executable.ExecutableMavenJar jar-med-afhængigheder 

På samme måde som den manuelle tilgang er vi nødt til at give oplysninger om hovedklassen; forskellen er, at Maven Assembly Plugin automatisk kopierer alle nødvendige afhængigheder til en krukke fil.

I deskriptorRefs del af konfigurationskoden, vi har angivet navnet, der føjes til projektnavnet.

Output i vores eksempel vil blive navngivet som core-java-jar-with-dependencies.jar.

  • fordele - afhængigheder inde i krukke fil, kun en fil
  • ulemper - grundlæggende kontrol med emballering af din artefakt, for eksempel er der ingen klasse-flytningsstøtte

2.3. Apache Maven Shade Plugin

Apache Maven Shade Plugin giver mulighed for at pakke artefakten i en uber-jar, som består af alle afhængigheder, der kræves for at køre projektet. Desuden understøtter det skygge - dvs. omdøbe - pakkerne til nogle af afhængighederne.

Lad os se på konfigurationen:

 org.apache.maven.plugins maven-skygge-plugin skygge sand com.baeldung.executable.ExecutableMavenJar 

Der er tre hoveddele af denne konfiguration:

Først, markerer alle afhængigheder, der skal pakkes ind i krukke.

For det andet er vi nødt til at specificere transformerimplementeringen; vi brugte standarden i vores eksempel.

Endelig skal vi angive hovedklassen i vores ansøgning.

Outputfilen navngives core-java-0.1.0-SNAPSHOT-shaded.jar, hvor core-java er vores projektnavn efterfulgt af snapshotversion og plugin-navn.

  • fordele - afhængigheder inde i krukke fil, avanceret kontrol med emballering af din artefakt med skygge og klasseforflytning
  • ulemper - kompleks konfiguration (især hvis vi vil bruge avancerede funktioner)

2.4. Et Jar Maven-plugin

En anden mulighed for at oprette eksekverbar krukke er One Jar-projektet.

Dette giver brugerdefineret klasselæsser, der ved, hvordan man indlæser klasser og ressourcer fra krukker i et arkiv i stedet for fra krukker i filsystemet.

Lad os se på konfigurationen:

 com.jolira onejar-maven-plugin org.baeldung.executable. ExecutableMavenJar true $ {project.build.finalName}. $ {Project.packaging} one-jar 

Som det vises i konfigurationen, skal vi angive hovedklassen og vedhæfte alle afhængigheder, der skal bygges, ved hjælp af vedhæftToBygning= sandt.

Vi skal også give outputfilnavnet. Desuden er målet for Maven en krukke. Bemærk, at One Jar er en kommerciel løsning, der vil gøre afhængighed krukker ikke udvidet til filsystemet ved kørselstid.

  • fordele - ren delegationsmodel, tillader klasser at være på øverste niveau i One Jar, understøtter ekstern krukker og kan understøtte oprindelige biblioteker
  • ulemper - ikke aktivt støttet siden 2012

2.5. Spring Boot Maven-plugin

Endelig er den sidste løsning, vi vil se på, Spring Boot Maven Plugin.

Dette gør det muligt at pakke eksekverbar krukke eller krig arkiver og kør en applikation "på stedet".

For at bruge det skal vi bruge mindst Maven version 3.2. Den detaljerede beskrivelse er tilgængelig her.

Lad os se på konfigurationen:

 org.springframework.boot spring-boot-maven-plugin repackage spring-boot com.baeldung.executable.ExecutableMavenJar 

Der er to forskelle mellem Spring-plugin og de andre. For det første kaldes målet for udførelsen ompakning, og klassifikatoren er navngivet spring-boot.

Bemærk, at vi ikke behøver at have Spring Boot-applikation for at kunne bruge dette plugin.

  • fordele - afhængigheder inde i en krukke fil, kan du køre den på ethvert tilgængeligt sted, avanceret kontrol med emballering af din artefakt med undtagelse af afhængigheder fra krukke fil osv., emballering af krig filer også
  • ulemper - tilføjer potentielt unødvendige forårs- og fjederstøvrelaterede klasser

2.6. Webapplikation med eksekverbar Tomcat

I den sidste del vil vi dække emnet med at have en enkeltstående webapplikation, der er pakket inde i en jar fil. For at gøre det skal vi bruge forskellige plugins, der er designet til at oprette eksekverbare jar-filer:

 org.apache.tomcat.maven tomcat7-maven-plugin 2.0 tomcat-run exec-war-only package / false webapp.jar utf-8 

Det mål er indstillet som kun udføre krig, sti til din server er angivet inde konfiguration tag med yderligere egenskaber, ligesom finalName, tegnsæt osv. At bygge en jar, løb mand pakke, hvilket vil resultere i oprettelse webapp.jar i din mål vejviser. At løbe

For at køre applikationen skal du bare skrive dette i din konsol: java -jar mål / webapp.jar og prøv at teste det ved at specificere lokal vært: 8080/ i en browser.

  • fordele - at have en fil, nem at implementere og køre
  • ulemper - en filstørrelse er meget større på grund af pakning af Tomcat integreret distribution i en war fil

Bemærk, at dette er den nyeste version af dette plugin, som understøtter Tomcat7-serveren. For at undgå fejl skal du kontrollere, at din afhængighed af Servlets har rækkevidde angivet som stillet til rådighedEllers vil der være en konflikt på runtime af eksekverbar krukke:

 javax.servlet javax.servlet-api leveres 

3. Konklusion

I denne artikel beskrev vi mange måder at oprette en eksekverbar på krukke med forskellige Maven-plugins.

Den fulde implementering af denne tutorial kan findes i denne (eksekverbare jar) og denne (eksekverbare krig) Github-projekter.

Hvordan tester man? For at kompilere projektet i en eksekverbar krukke, kør venligst Maven med mvn ren pakke kommando.

Forhåbentlig giver denne artikel dig mere indsigt i emnet, og du finder din foretrukne tilgang afhængigt af dine behov.

En hurtig sidste note - sørg for, at licenserne til de krukker, du bundter, ikke forbyder denne form for operation. Generelt vil det ikke være tilfældet, men det er noget, der er værd at overveje.