Webapplicaties implementeren in Jetty

1. Overzicht

In dit artikel zullen we een kort overzicht geven van de Jetty-webserver en vervolgens verschillende benaderingen behandelen voor het implementeren van een WAR-bestand.

Jetty is een open source Java HTTP-webserver en een servletcontainer. Jetty wordt vaker gebruikt in machine-to-machine-communicatie in het Java-ecosysteem.

2. Projectconfiguratie

De laatste versie van Jetty kan altijd gedownload worden door deze link te volgen. We zullen een zeer eenvoudige Java-webtoepassing maken vanaf de opdrachtregel met Maven, die we zullen gebruiken voor onze voorbeelden.

In dit artikel gebruiken we Jetty 9.x, de nieuwste versie van dit moment.

Laten we naar onze console gaan, naar onze gewenste locatie navigeren en de volgende opdracht uitvoeren:

mvn-archetype: genereer -DgroupId = com.baeldung -DartifactId = steiger-app -DarchetypeArtifactId = maven-archetype-webapp -DinteractiveMode = false

Met deze opdracht wordt een volledige Java-webapp gemaakt in een nieuw steiger-app map op onze huidige locatie. Het is slechts een van de vele manieren om een ​​Java-applicatie met Maven te maken en het past bij ons doel.

Omdat we te maken hebben met WAR-bestanden, gaan we naar de root van het project en bouwen het:

cd steiger-app

Bouwen met Maven:

mvn-pakket

Dan steiger-app.war wordt op locatie aangemaakt steiger-app / target / steiger-app.war.

3. Steigerconstructie

Contextpad. Verwijst naar de locatie die relatief is aan het serveradres en vertegenwoordigt de naam van de webapplicatie.

Als onze webapplicatie bijvoorbeeld onder de $ JETTY_HOME \ webapps \ mijnapp directory, wordt deze geopend via de URL // localhost / mijnapp, en het contextpad zal zijn / mijnapp.

OORLOG. Is de extensie van een bestand dat een directoryhiërarchie van webtoepassingen verpakt in ZIP-indeling en is een afkorting voor Web Archive. Java-webtoepassingen worden meestal verpakt als WAR-bestanden voor implementatie. WAR-bestanden kunnen worden gemaakt op de opdrachtregel of met een IDE zoals Eclipse.

4. Implementatie door WAR te kopiëren

De eenvoudigste manier om een ​​webtoepassing op de Jetty-server te implementeren, is waarschijnlijk door het WAR-bestand naar het $ JETTY_HOME / webapps directory.

Na het kopiëren kunnen we de server starten door naar $ JETTY_HOME en het uitvoeren van de opdracht:

java -jar start.jar

Jetty zal het scannen $ JETTY_HOME / webapps directory bij het opstarten zodat webtoepassingen kunnen worden geïmplementeerd. Onze nieuwe app wordt ingezet op / steiger-app context.

Wanneer we de URL laden // localhost: 8080 / steiger-app vanuit de browser zouden we onze app moeten zien draaien met Hallo Wereld! afgedrukt op het scherm.

5. Implementeren met behulp van een contextbestand

Jetty webserver biedt ons een manier om implementeer een webarchief ergens in het bestandssysteem te vinden doordat wij er een contextbestand voor hebben gemaakt.

Op deze manier, zelfs als ons WAR-bestand zich op een desktop bevindt of als we ervoor hebben gekozen het in steiger-app / target waar Maven het pakket plaatst, kunnen we gewoon het contextbestand erin maken $ JETTY_HOME / webapps.

Laten we het steiger-app.war we hebben het zojuist geïmplementeerd door het te verwijderen uit webapps. We zullen dan creëren steiger-app.xml met de volgende code en plaats deze erin webapps:

   / steiger absoluut / pad / naar / steiger-app.war 

Dit contextbestand moet dezelfde naam hebben als onze WAR, met XML-bestandsextensie. Merk op dat we de contextPath toe te schrijven aan /steiger. Dit betekent dat we onze web-app zullen openen via de URL // localhost: 8080 / steiger.

Deze mogelijkheid om het contextpad aan te passen is een van de grote voordelen van de contextbestandsbenadering van het implementeren van WAR's in Jetty, aangezien sommige app-namen mogelijk niet geschikt zijn voor dit doel.

6. Implementeren met de Jetty Maven-plug-in

6.1. Standaardimplementatie

De Jetty Maven-plug-in helpt ons om snelle tests en iteraties uit te voeren tijdens het bouwen van Java-webapplicaties. Om er applicaties mee te kunnen implementeren en uitvoeren, hoeven we alleen de plug-in toe te voegen pom.xml:

 org.eclipse.jetty jetty-maven-plugin 9.3.11.v20160721 

De nieuwste versie is te vinden door deze Maven-link te volgen.

We moeten ervoor zorgen dat onze instantie van Jetty op port 8080 wordt gestopt voordat we de volgende stap uitvoeren.

Om onze app te implementeren na het toevoegen van de plug-in, navigeren we naar de root waar pom.xml bevindt zich en voer de volgende opdracht uit:

mvn steiger: run

Met deze opdracht wordt een nieuwe aanlegsteiger gemaakt en de plug-in implementeert de app erop. We hebben er toegang toe door te laden // localhost: 8080.

De Jetty Maven-plug-in scant het webproject continu op eventuele wijzigingen en blijft het opnieuw implementeren.

6.2. Het wijzigen van het ContextPath

Vanaf de vorige subsectie is de app geïmplementeerd onder / context. Als we echter willen implementeren onder een bepaald contextpad, zoals /steiger zoals eerder zullen we de plug-in anders moeten configureren.

We zullen onze plug-in-verklaring wijzigen in de volgende XML:

 org.eclipse.jetty jetty-maven-plugin 9.3.11.v20160721 / jetty 

Merk op hoe we een configuratieblok hebben toegevoegd om onze implementatie verder aan te passen. Er zijn verschillende configuratie-opties die in dit blok kunnen worden geplaatst, afhankelijk van wat men wil.

Na deze wijzigingen kunnen we de plug-in opnieuw uitvoeren zoals voorheen en toegang krijgen tot onze app via // localhost: 8080 / steiger.

6.3. De poort wijzigen

Een scenario waarmee u te maken kunt krijgen, is een uitzondering op de poort in gebruik. Misschien hebben we een aanlegsteiger die op de poort draait 8080 voor productie, maar we bevinden ons nog in de ontwikkelingsfase en willen profiteren van het iteratiegemak dat gepaard gaat met de implementatie met de Maven-plug-in.

In dergelijke gevallen moeten we onze testserver op een andere poort laten draaien. Laten we de configuratie van de plug-in wijzigen in de volgende XML:

  / steiger 8888 

Wanneer we onze Maven-plug-in opnieuw uitvoeren, hebben we toegang tot onze app vanuit // localhost: 8888 / steiger.

Het is vermeldenswaard dat we met de Jetty Maven-plug-in geen instantie van een jetty hoeven te hebben geïnstalleerd en actief. Het creëert eerder zijn eigen aanlegsteiger.

7. Implementatie met Jetty Runner

Net als de Jetty Maven-plug-in, biedt de jetty-runner een snelle en gemakkelijke manier om onze web-app te implementeren en uit te voeren. Met jetty-runner hoeven we ook geen aparte instantie van een steigerserver te installeren en uit te voeren.

7.1. Jetty Runner instellen

Om jetty-runner te gebruiken bij een snelle implementatie en uitvoering van onze web-apps, kunnen we de nieuwste versie downloaden door deze Maven-link te volgen.

Met jetty-runner hoeven we alleen de gedownloade jar overal te plaatsen waar we willen en klaar zijn met het bestandssysteempad naar onze webarchieven.

We kunnen configuratieparameters doorgeven vanaf de opdrachtregel en talloze applicaties in verschillende contexten implementeren en met slechts één opdracht aan verschillende poorten zijn gebonden.

Ik heb mijn jetty-runner-pot in dezelfde hiërarchie geplaatst als de steiger-app directory. Dat is de directory met onze webapplicatie.

7.2. Basisimplementatie

Laten we onze WAR inzetten met behulp van jetty-runner:

java -jar steiger-runner-9.4.0.M1.jar steiger-app / target / steiger-app.war

Deze opdracht maakt, net als het geval van de Maven-plug-in, een steigerinstantie aan en implementeert de meegeleverde WAR erop. Het WAR-pad kan een absoluut of een relatief pad zijn.

We kunnen deze applicatie laden met // localhost: 8080.

7.3. Implementeren met contextpad

Te implementeren onder /steiger context als voorheen:

java -jar steiger-runner-9.4.0.M1.jar --pad / steiger steiger-app / doel / steiger-app.war

Bereikbaar via // localhost: 8080 / steiger.

7.4. Implementeren op bepaalde poort

Implementeren op een bepaald poortnummer:

java -jar steiger-runner-9.4.0.M1.jar --poort 9090 steiger-app / doel / steiger-app.war

Bereikbaar via // localhost: 9090.

7.5. Implementeer meerdere WAR's

Om meerdere WAR's met hetzelfde commando in te zetten, gebruiken we de -pad argument om elk uniek te maken:

java -jar jetty-runner --path / one one.war --path / two two.war

We zouden dan toegang krijgen een.oorlog via // localhost: 8080 / een en twee. oorlog via // localhost: 8080 / twee.

8. Implementeer met de Cargo Maven-plug-in

Cargo is een veelzijdige bibliotheek waarmee we verschillende soorten applicatiecontainers op een standaardmanier kunnen manipuleren.

8.1. Installatie van ladingimplementatie

In deze sectie zullen we bekijken hoe gebruik de Maven-plug-in van Cargo om een ​​WAR naar Jetty te implementeren, in dit geval implementeren we een WAR naar een Jetty 9.x-instantie.

Om grip te krijgen op het hele proces, beginnen we helemaal opnieuw met het maken van een nieuwe Java-webapplicatie vanaf de opdrachtregel:

mvn-archetype: genereer -DgroupId = com.baeldung -DartifactId = vracht-inzet -DarchetypeArtifactId = maven-archetype-webapp -DinteractiveMode = false

Hiermee wordt een complete Java-webtoepassing gemaakt in de lading-inzetten directory. Als we deze applicatie bouwen, implementeren en laden zoals hij is, wordt deze afgedrukt Hallo Wereld! in de browser.

Omdat onze webapplicatie geen servlets bevat, is onze web.xml bestand zal erg basic zijn. Dus navigeer naar het WEB-INF map van ons nieuw aangemaakte project en maak een web.xml als het nog niet automatisch is gemaakt met de volgende inhoud:

  cargo-deploy index.jsp 

Om Maven in staat te stellen de commando's van vracht te herkennen zonder de volledig gekwalificeerde naam te typen, moeten we de vracht Maven-plug-in toevoegen aan een plug-in-groep in Maven's settings.xml.

Als een direct kind van de wortel element, voeg dit toe:

 org.codehaus.cargo 

8.2. Lokale implementatie

In deze onderafdeling zullen we onze pom.xml om aan onze nieuwe implementatievereisten te voldoen.

Voeg de plug-in als volgt toe:

   org.codehaus.cargo cargo-maven2-plugin 1.5.0 jetty9x geïnstalleerd Absolute pad naar aanlegsteiger 9 installatie bestaande invoegen absoluut pad naar aanlegsteiger 9 installatie invoegen 

Merk op dat we definieer de verpakking expliciet als een WAR, zonder dit zal onze build mislukken. In de sectie plug-ins voegen we vervolgens de cargo maven2-plug-in toe.

De nieuwste versie op het moment van schrijven is 1.5.0. De laatste versie is hier echter altijd te vinden. Bovendien voegen we een configuratiegedeelte toe waarin we Maven vertellen dat we een Jetty-container gebruiken en ook een bestaande Jetty-installatie.

Door het containertype in te stellen op geïnstalleerd, we vertellen Maven dat we een Jetty-instantie op de machine hebben geïnstalleerd en we geven de absolute URL naar deze installatie.

Door het configuratietype in te stellen op bestaande, vertellen we Maven dat we een bestaande setup hebben die we gebruiken en dat er geen verdere configuratie nodig is.

Het alternatief zou zijn om de vracht te vertellen om de opgegeven Jetty-versie te downloaden en in te stellen door een URL op te geven. Onze focus ligt echter op WAR-implementatie.

Het is vermeldenswaard dat of we nu Maven 2.x of Maven 3.x gebruiken, de cargo maven2-plug-in voor beide werkt.

We kunnen onze applicatie nu installeren door het volgende uit te voeren:

mvn installeren

en implementeer het door het volgende uit te voeren:

mvn lading: inzetten

Als alles goed gaat in de Maven- en Jetty-console, dan zouden we onze webapplicatie moeten kunnen draaien door te laden // localhost: 8080 / cargo-deploy.

Als we het $ JETTY_HOME / webapps map, zullen we een Deployment-descriptorbestand vinden of wat we eerder contextbestand noemden cargo-deploy.xml gecreëerd door lading.

8.3. Implementatie op afstand

Jetty biedt standaard geen mogelijkheden voor implementatie op afstand. Om een ​​dergelijke ondersteuning aan Jetty toe te voegen, gebruikt Cargo de Jetty-implementatie op afstand Web applicatie.

Dit betekent dat we een webtoepassing WAR moeten downloaden die vooraf is gemaakt door de Cargo-ontwikkelaars en deze WAR moet implementeren op de doelsteigercontainer.

Elke keer dat we op deze externe server willen implementeren met behulp van de Cargo Maven-plug-in, stuurt deze een HTTP-verzoek naar de implementatietoepassing op de externe server met onze WAR voor implementatie.

Deze externe implementator is hier te vinden. Ga naar de hulpmiddelen sectie en download het cargo-steiger-7-en-verder-implementator OORLOG.

Beveiligingsoverwegingen

We moeten een beveiligingsrijk in steiger voordat dit kan werken, voor authenticatiedoeleinden. Maak een bestand met de naam realm.properties in $ JETTY_HOME / enz directory van de externe steigerserver. De inhoud van het bestand is:

admin: wachtwoord, manager

De beheerder is de gebruikersnaam waarmee de klant toegang heeft tot de beveiligde apps, wachtwoord is het wachtwoord en manager is de rol die de clients moeten vervullen voordat ze toegang krijgen.

We moeten ook onze beveiligingsvereisten aangeven in de implementatietoepassing. We zullen de WAR die we hebben gedownload van de downloadpagina van de steiger uitpakken, enkele wijzigingen aanbrengen en deze weer inpakken in een WAR.

Ga na het uitpakken naar WEB-INF / web.xml en verwijder commentaar op de XML-code met de Uncomment om beveiliging te activeren commentaar. Of plaats daar de volgende code:

  Jetty Remote Deployer / * manager BASIC Test Realm 

Implementatie van de implementator

We kunnen de app nu weer inpakken in een WAR en deze naar elke locatie op de externe server kopiëren. We zullen het dan inzetten op Jetty.

Tijdens de implementatie kunt u het beste een Deployment descriptor-bestand zodat we een securityHandler en ga ernaar toe a loginService. Alle beveiligde applicaties moeten een inlogservice hebben, anders kan de steiger ze niet implementeren.

Laten we nu een contextbestand maken in $ JETTY_HOME / webapps van de externe aanlegsteiger, onthoud de regels voor het benoemen van het contextbestand. Maak er dezelfde naam van als de WAR:

   / deployer absolute / path / to / cargo-jetty-deployer.war Test Realm /etc/realm.properties 

Start de externe steigerserver en als alles goed gaat, zouden we moeten kunnen laden // localhost: 8080 / cargo-jetty-deployer. We zouden dan iets moeten kunnen zien als:

HTTP ERROR 400 Probleem bij toegang tot / cargo-jetty-deployer /. Reden: Commando / is onbekend

WAR implementeren op de afgelegen steiger

Om een ​​implementatie op afstand uit te voeren, hoeven we alleen ons configuratiegedeelte van pom.xml. Implementatie op afstand betekent dat we geen lokale installatie van Jetty hebben, maar geauthenticeerde toegang tot de Deployer-app die op de externe server wordt uitgevoerd.

Dus laten we de pom.xml zodat de configuratiesectie er als volgt uitziet:

  jetty9x externe runtime 127.0.0.1 8080 beheerderswachtwoord 

Deze keer wijzigen we het containertype van geïnstalleerd naar afgelegen en het configuratietype van bestaande naar looptijd. Ten slotte voegen we hostnaam, poort en authenticatie-eigenschappen toe aan de configuratie.

maak het project schoon:

mvn schoon

installeer het:

mvn installeren

implementeer het ten slotte:

mvn lading: inzetten

Dat is het.

9. Implementeren vanuit Eclipse

Met Eclipse kunnen we servers insluiten om webprojectimplementatie toe te voegen aan de normale workflow zonder de IDE te verlaten.

9.1. Jetty inbedden in Eclipse

We kunnen een Jetty-installatie in Eclipse insluiten door te selecteren venster item uit de taakbalk en vervolgens voorkeuren uit het vervolgkeuzemenu.

We zullen een boomstructuur met voorkeursitems vinden in het linkerpaneel van het venster dat verschijnt. We kunnen dan naar eclipse -> servers navigeren of gewoon servers typen in de zoekbalk.

We selecteren vervolgens de Jetty-map als deze nog niet voor ons is geopend en kiezen de Jetty-versie die we hebben gedownload.

Aan de rechterkant van het paneel zal een configuratiepagina verschijnen waar we de optie inschakelen selecteren om deze Jetty-versie te activeren en naar de installatiemap bladeren.

Vanaf de schermafbeeldingen wordt steiger 7.x vervangen door de versie van de steiger die we hebben geconfigureerd.

We passen wijzigingen toe en de volgende keer dat we de serverweergave openen vanuit de vensters van Eclipse -> submenu weergeven, zal de nieuw geconfigureerde server aanwezig zijn en kunnen we toepassingen erop starten, stoppen en implementeren.

9.2. Webapplicatie implementeren in Embedded Jetty

Om een ​​webtoepassing op de ingesloten Jetty-instantie te implementeren, moet deze in onze werkruimte aanwezig zijn.

Open de servers view from window -> show view en zoek naar servers. Indien geopend, kunnen we gewoon met de rechtermuisknop klikken op de server die we hebben geconfigureerd en selecteren implementatie toevoegen vanuit het contextmenu dat verschijnt.

Van de Nieuwe implementatie dialoogvenster dat verschijnt, open het project dropdownmenu en selecteer het webproject.

Er is een Type implementeren sectie onder de Project keuzelijst met invoervak ​​wanneer we selecteren Exploded Archive (ontwikkelmodus), onze wijzigingen in de applicatie worden live gesynchroniseerd zonder opnieuw te hoeven implementeren, dit is de beste optie tijdens de ontwikkeling, aangezien het zeer efficiënt is.

Selecteren Verpakt archief (productiemodus) vereist dat we elke keer dat we wijzigingen aanbrengen opnieuw implementeren en deze in de browser zien. Dit is alleen het beste voor productie, maar toch maakt Eclipse het even gemakkelijk.

9.3. Webapplicatie op externe locatie implementeren

We kiezen er meestal voor om een ​​WAR via Eclipse te implementeren om foutopsporing te vergemakkelijken. Er kan een tijd komen dat we willen dat het wordt geïmplementeerd op een andere locatie dan die wordt gebruikt door de ingebouwde servers van Eclipse.

De meest voorkomende instantie is waar onze productieserver online is en we de webapplicatie willen updaten.

We kunnen deze procedure omzeilen door in productiemodus te implementeren en de Implementeer locatie in de Nieuwe implementatie dialoogvenster en het kiezen van de OORLOG van daaruit.

Tijdens de implementatie kunnen we, in plaats van een ingesloten server te selecteren, het optie van de servers weergave naast de lijst met ingesloten servers. We navigeren naar de $ JETTY_HOME/webapps directory van een externe Jetty-installatie.

10. Implementeren vanuit IntelliJ IDEA

Om een ​​webtoepassing op Jetty te implementeren, moet deze bestaan ​​en al zijn gedownload en geïnstalleerd.

10.1. Lokale configuratie

Open de Rennen menu en klik op het Configuraties bewerken opties.

Zoek in het paneel aan de linkerkant naar Jetty Server, als het er niet is, klik op het + teken in het menu, zoek naar Steiger en selecteer Lokaal. In de naam veld gezet Steiger 9.

Klik op de Configureren ... knop en in Jetty Home navigeer naar de thuislocatie van uw installatie en selecteer deze.

Stel desgewenst het Opstarten pagina te zijn // localhost: 8080 / en HTTP-poort: 8080, wijzig de poort zoals gewenst.

Ga naar het Inzet tab en klik op het + -symbool, selecteer het artefact dat u aan de server wilt toevoegen en klik op OK

10.2. Configuratie op afstand

Volg dezelfde instructies als voor lokale Jetty-configuraties, maar op het server-tabblad moet u de externe locatie van de installatie invoeren.

11. Conclusie

In dit artikel hebben we uitgebreid ingegaan op de verschillende manieren om een ​​WAR-bestand in de Jetty-webserver te implementeren.