Hvordan lage en kjørbar JAR med Maven

1. Introduksjon

I denne raske artikkelen vil vi fokusere på pakking av et Maven-prosjekt i en kjørbar Jar-fil.

Vanligvis når du oppretter en krukke fil, vil vi utføre den enkelt uten å bruke IDE; for det formål vil vi diskutere konfigurasjonen og fordelene ved å bruke hver av disse tilnærmingene for å lage den kjørbare filen.

2. Konfigurasjon

For å lage en kjørbar krukke, vi trenger ingen ekstra avhengigheter. Vi trenger bare å lage Maven Java-prosjekt, og ha minst en klasse med hoved(…) metode.

I vårt eksempel opprettet vi Java-klasse med navnet ExecutableMavenJar.

Vi må også sørge for at vår pom.xml inneholder følgende elementer:

4.0.0 com.baeldung core-java 0.1.0-SNAPSHOT jar

Det viktigste aspektet her er typen - å lage en kjørbar krukke, dobbeltsjekk konfigurasjonen bruker en krukke type.

Nå kan vi begynne å bruke de forskjellige løsningene.

2.1. Manuell konfigurasjon

La oss starte med en manuell tilnærming - ved hjelp av maven-avhengighets-plugin.

Først kopierer vi alle nødvendige avhengigheter til mappen vi spesifiserer:

 org.apache.maven.plugins maven-avhengighet-plugin kopi-avhengigheter forbered pakke kopi-avhengigheter $ {project.build.directory} / libs 

Det er to viktige aspekter å legge merke til. Først spesifiserer vi målet kopi-avhengigheter, som forteller Maven å kopiere disse avhengighetene til det angitte outputDirectory.

I vårt tilfelle oppretter vi en mappe med navnet libs, inne i prosjektbyggingskatalogen (som vanligvis er mål mappe).

I det andre trinnet skal vi lage kjørbare og klassebevisste krukke, med lenken til avhengighetene som ble kopiert i første trinn:

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

Den viktigste delen av ovennevnte er manifestere konfigurasjon. Vi legger til en klassesti, med alle avhengigheter (mappe libs /), og gi informasjon om hovedklassen.

Vær oppmerksom på at vi må oppgi fullt kvalifiserte navngitte klasser, noe som betyr at det vil inneholde pakkenavn.

Fordelene og ulempene med denne tilnærmingen er:

  • proffer - gjennomsiktig prosess, der vi kan spesifisere hvert trinn
  • ulemper - manuell, avhengigheter er utenfor finalen krukke, som betyr at den kjørbare filen din krukke vil bare kjøre hvis libs mappen vil være tilgjengelig og synlig for en krukke

2.2. Apache Maven Assembly Plugin

Apache Maven Assembly Plugin tillater brukere å samle prosjektutdataene sammen med dens avhengigheter, moduler, nettstedsdokumentasjon og andre filer i en enkelt, kjørbar pakke.

Hovedmålet i monteringsprogrammet er enkelt mål - brukes til å opprette alle samlinger (alle andre mål avskaffes og vil bli fjernet i en fremtidig utgivelse).

La oss ta en titt på konfigurasjonen i pom.xml:

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

På samme måte som den manuelle tilnærmingen, må vi gi informasjon om hovedklassen; Forskjellen er at Maven Assembly Plugin automatisk kopierer alle nødvendige avhengigheter til en krukke fil.

I deskriptorRefs del av konfigurasjonskoden, ga vi navnet, som vil bli lagt til prosjektnavnet.

Output i vårt eksempel vil bli kalt som core-java-jar-with-dependencies.jar.

  • proffer - avhengigheter inne i krukke fil, bare en fil
  • ulemper - grunnleggende kontroll av emballering av gjenstanden din, for eksempel er det ingen klasseflyttingsstøtte

2.3. Apache Maven Shade Plugin

Apache Maven Shade Plugin gir muligheten til å pakke gjenstanden i en uber-jar, som består av alle avhengigheter som kreves for å kjøre prosjektet. Videre støtter den skyggelegging - dvs. gi nytt navn - pakkene til noen avhengighetene.

La oss ta en titt på konfigurasjonen:

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

Det er tre hoveddeler av denne konfigurasjonen:

Først, markerer alle avhengigheter som skal pakkes inn i krukke.

For det andre må vi spesifisere transformatorimplementeringen; vi brukte standarden i vårt eksempel.

Til slutt må vi spesifisere hovedklassen i applikasjonen vår.

Utdatafilen får navnet core-java-0.1.0-SNAPSHOT-shaded.jar, hvor core-java er vårt prosjektnavn, etterfulgt av øyeblikksbildeversjon og plugin-navn.

  • proffer - avhengigheter inne i krukke fil, avansert kontroll av innpakning av gjenstanden din, med skyggelegging og klasseflytting
  • ulemper - kompleks konfigurasjon (spesielt hvis vi vil bruke avanserte funksjoner)

2.4. One Jar Maven Plugin

Et annet alternativ for å lage kjørbar krukke er One Jar-prosjektet.

Dette gir tilpasset klasselaster som vet hvordan du skal laste klasser og ressurser fra krukker i et arkiv, i stedet for fra krukker i filsystemet.

La oss ta en titt på konfigurasjonen:

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

Som det vises i konfigurasjonen, må vi spesifisere hovedklassen og legge ved alle avhengigheter som skal bygges, ved hjelp av attachToBuild= sant.

Vi bør også gi utdatafilnavnet. Videre er målet for Maven en krukke. Vær oppmerksom på at One Jar er en kommersiell løsning som vil gjøre avhengighet krukker ikke utvidet til filsystemet ved kjøretid.

  • proffer - ren delegasjonsmodell, gjør at klasser kan være på øverste nivå av One Jar, støtter ekstern krukker og kan støtte innfødte biblioteker
  • ulemper - ikke støttet aktivt siden 2012

2.5. Spring Boot Maven Plugin

Endelig er den siste løsningen vi ser på Spring Boot Maven Plugin.

Dette gjør det mulig å pakke kjørbar krukke eller krig arkiver og kjør et program "på stedet".

For å bruke den må vi bruke minst Maven versjon 3.2. Den detaljerte beskrivelsen er tilgjengelig her.

La oss ta en titt på konfigurasjonen:

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

Det er to forskjeller mellom Spring-plugin og de andre. Først kalles målet for henrettelsen ompakking, og klassifisereren heter vårstøvel.

Vær oppmerksom på at vi ikke trenger å ha Spring Boot-applikasjon for å kunne bruke dette pluginet.

  • proffer - avhengigheter inne i en krukke filen, kan du kjøre den på alle tilgjengelige steder, avansert kontroll over emballering av gjenstanden din, med unntak avhengigheter fra krukke fil etc., emballasje av krig filer også
  • ulemper - legger til potensielt unødvendige vår- og vårstøvlerelaterte klasser

2.6. Webapplikasjon med kjørbar Tomcat

I den siste delen ønsker vi å dekke temaet med å ha en frittstående webapplikasjon, som er pakket inne i en jar fil. For å gjøre det, må vi bruke forskjellige plugins, designet for å lage kjørbare jar-filer:

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

De mål er satt som bare utføre krig, sti til serveren din er spesifisert inne konfigurasjon tag, med flere egenskaper, som finalName, charset etc. Å bygge en jar, løpe mann pakke, som vil resultere i oppretting webapp.jar i din mål katalog. Å løpe

For å kjøre applikasjonen, skriv bare dette i konsollen: java -jar target / webapp.jar og prøv å teste det ved å spesifisere lokal vert: 8080/ i en nettleser.

  • proffer - å ha en fil, enkel å distribuere og kjøre
  • ulemper - en filstørrelse er mye større på grunn av pakking av Tomcat innebygd distribusjon i en war fil

Vær oppmerksom på at dette er den siste versjonen av dette pluginet, som støtter Tomcat7-serveren. For å unngå feil, vennligst sjekk at avhengigheten din for Servlets har omfang angitt som sørget for, ellers vil det være en konflikt på kjøretid av kjørbar krukke:

 javax.servlet javax.servlet-api gitt 

3. Konklusjon

I denne artikkelen beskrev vi mange måter å lage en kjørbar fil på krukke med forskjellige Maven-plugins.

Den fulle implementeringen av denne veiledningen finner du i denne (kjørbare jar) og denne (kjørbare krigen) Github-prosjektene.

Hvordan teste? For å kompilere prosjektet i en kjørbar krukke, vennligst kjør Maven med mvn ren pakke kommando.

Forhåpentligvis gir denne artikkelen deg litt mer innsikt i emnet, og du vil finne din foretrukne tilnærming avhengig av dine behov.

En rask siste merknad - sørg for at lisensene til krukkene du pakker ikke forby denne typen operasjoner. Generelt vil det ikke være tilfelle, men det er noe det er verdt å vurdere.


$config[zx-auto] not found$config[zx-overlay] not found