Bereitstellen von Webanwendungen in Jetty

Bereitstellen von Webanwendungen in Jetty

1. Überblick

In diesem Artikel geben wir einen kurzen Überblick über den Jetty-Webserver und erläutern dann verschiedene Ansätze zum Bereitstellen einer WAR-Datei.

Jetty ist ein Open-Source-Java-HTTP-Webserver und ein Servlet-Container. Anlegestelle wird im Java-Ökosystem häufiger für die Kommunikation von Maschine zu Maschine verwendet.

2. Projektaufbau

Die neueste Version von Jetty kann immer heruntergeladen werden, indem Siethis link folgen. Wir werden mit Maven eine sehr einfache Java-Webanwendung über die Befehlszeile erstellen, die wir für unsere Beispiele verwenden werden.

In diesem Artikel verwenden wir Jetty 9.x, die aktuellste Version.

Gehen wir zu unserer Konsole, navigieren Sie zu dem Ort Ihrer Wahl und führen Sie den folgenden Befehl aus:

mvn archetype:generate -DgroupId=com.example -DartifactId=jetty-app
  -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false

Dieser Befehl erstellt eine vollständige Java-Webanwendung in einem neuen Ordnerjetty-appan unserem aktuellen Speicherort. Dies ist nur eine von vielen Möglichkeiten, eine Java-Anwendung mit Maven zu erstellen, und sie entspricht unserem Zweck.

Da es sich um WAR-Dateien handelt, navigieren wir zum Projektstamm und erstellen ihn:

cd jetty-app

Bauen mit Maven:

mvn package

Dann werdenjetty-app.war an Positionjetty-app/target/jetty-app.war erstellt.

3. Stegstruktur

Context path. Verweist auf den Speicherort, der relativ zur Serveradresse ist und den Namen der Webanwendung darstellt.

Wenn unsere Webanwendung beispielsweise im Verzeichnis$JETTY_HOME\webapps\myapp abgelegt wird, wird über die URLhttp://localhost/myapp auf sie zugegriffen, und ihr Kontextpfad lautet/myapp.

WAR. Ist die Erweiterung einer Datei, die eine Webanwendungsverzeichnishierarchie im ZIP-Format verpackt und die Abkürzung für Web Archive. Java-Webanwendungen werden normalerweise als WAR-Dateien für die Bereitstellung gepackt. WAR-Dateien können über die Befehlszeile oder mit einer IDE wie Eclipse erstellt werden.

4. Bereitstellung durch Kopieren von WAR

Der einfachste Weg, eine Webanwendung auf dem Jetty-Server bereitzustellen, besteht wahrscheinlich darin, die WAR-Datei in das Verzeichnis$JETTY_HOME/webappszu kopieren.

Nach dem Kopieren können wir den Server starten, indem wir zu$JETTY_HOME navigieren und den folgenden Befehl ausführen:

java -jar start.jar

Jetty durchsucht beim Start das Verzeichnis`$JETTY_HOME/webapps`nach Webanwendungen, die bereitgestellt werden sollen. Unsere neue App wird im Kontext von/jetty-appbereitgestellt.

Wenn wir die URLhttp://localhost:8080/jetty-app aus dem Browser laden, sollte unsere App mitHello world! auf dem Bildschirm gedruckt werden.

5. Bereitstellen mithilfe der Kontextdatei

Der Jetty-Webserver bietet uns die Möglichkeit,deploy a web archivean einer beliebigen Stelle im Dateisystem zu finden, indem wir eine Kontextdatei dafür erstellen.

Selbst wenn sich unsere WAR-Datei auf einem Desktop befindet oder wir uns dafür entschieden haben, sie injetty-app/target zu belassen, wo Maven das Paket platziert, können wir auf diese Weise einfach ihre Kontextdatei in$JETTY_HOME/webapps erstellen.

Entfernen Sie die Bereitstellung derjetty-app.war, die wir gerade bereitgestellt haben, indem Sie sie auswebapps löschen. Wir werden dannjetty-app.xml mit dem folgenden Code erstellen und inwebapps einfügen:




    /jetty
    absolute/path/to/jetty-app.war

This context file must have the same name as our WAR mit XML-Dateierweiterung. Beachten Sie, dass wir das AttributcontextPath auf/jetty gesetzt haben. Dies bedeutet, dass wir über die URLhttp://localhost:8080/jetty auf unsere Web-App zugreifen.

Diese Möglichkeit, den Kontextpfad anzupassen, ist einer der großen Vorteile des Ansatzes für Kontextdateien beim Bereitstellen von WARs in Jetty, da einige App-Namen für diesen Zweck möglicherweise nicht geeignet sind.

6. Bereitstellung mit dem Jetty Maven Plugin

6.1. Standardbereitstellung

Das Jetty Maven-Plugin hilft uns, schnelle Tests und Iterationen beim Erstellen von Java-Webanwendungen durchzuführen. Um Anwendungen damit bereitstellen und ausführen zu können, müssen wir nur das Plugin inpom.xml hinzufügen:


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

Die neueste Version finden Sie unterthis Maven link.

Wir müssen sicherstellen, dass unsere Instanz von Jetty, die auf Port8080 ausgeführt wird, gestoppt wird, bevor wir den nächsten Schritt ausführen.

Um unsere App nach dem Hinzufügen des Plugins bereitzustellen, navigieren wir zum Stammverzeichnis, in dem sichpom.xml befindet, und führen den folgenden Befehl aus:

mvn jetty:run

Dieser Befehl erstellt eine neue Anlegestelleninstanz und das Plugin stellt die App dafür bereit. Wir können darauf zugreifen, indem wirhttp://localhost:8080. laden

Das Jetty Maven-Plug-in durchsucht das Webprojekt kontinuierlich nach Änderungen und stellt es immer wieder neu bereit.

6.2. ContextPath ändern

Aus dem vorherigen Unterabschnitt wurde die App im Kontext von/bereitgestellt. Wenn wir jedoch wie zuvor unter einem bestimmten Kontextpfad wie/jetty bereitstellen möchten, müssen wir das Plugin anders konfigurieren.

Wir werden unsere Plugin-Deklaration in folgendes XML ändern:


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

Beachten Sie, wie wir einen Konfigurationsblock hinzugefügt haben, um unsere Bereitstellung weiter anzupassen. Es gibt verschiedene Konfigurationsoptionen, die in diesen Block eingefügt werden können, je nachdem, was gewünscht wird.

Nach diesen Änderungen können wir das Plugin wie zuvor erneut ausführen und überhttp://localhost:8080/jetty auf unsere App zugreifen.

6.3. Ändern des Ports

Ein Szenario, mit dem man möglicherweise konfrontiert wird, ist eine Ausnahmebedingung für den verwendeten Port. Möglicherweise wird auf Port8080 eine Anlegestelleninstanz für die Produktion ausgeführt, aber wir befinden uns noch in der Entwicklungsphase und möchten von der einfachen Iteration profitieren, die mit der Bereitstellung mithilfe des Maven-Plugins einhergeht.

In solchen Fällen müssen wir unseren Testserver an einem anderen Port ausführen. Ändern wir die Plugin-Konfiguration in das folgende XML:


    
        /jetty
    
    
        8888
    

Wenn wir unser Maven-Plugin erneut ausführen, können wir vonhttp://localhost:8888/jetty auf unsere App zugreifen.

Es ist erwähnenswert, dass mit dem Jetty Maven-Plugin keine Instanz von Jetty installiert und ausgeführt werden muss. Es wird vielmehr eine eigene Anlegestelleninstanz erstellt.

7. Bereitstellung mit Jetty Runner

Genau wie das Jetty Maven-Plugin bietet der Jetty-Runner eine schnelle und einfache Möglichkeit, unsere Web-App bereitzustellen und auszuführen. Mit Jetty-Runner müssen wir auch keine separate Instanz eines Jetty-Servers installieren und ausführen.

7.1. Jetty Runner Setup

Um Jetty-Runner für die schnelle Bereitstellung und Ausführung unserer Web-Apps zu verwenden, können wir die neueste Version herunterladen, indem wir dieseMaven link befolgen.

Mit Jetty-Runner müssen wir nur die heruntergeladene JAR-Datei beliebig platzieren und den Dateisystempfad zu unseren Webarchiven bereithalten.

Wir können Konfigurationsparameter über die Befehlszeile übergeben sowie zahlreiche Anwendungen in verschiedenen Kontexten bereitstellen und mit nur einem Befehl an verschiedene Ports binden.

Ich habe mein Jetty-Runner-Glas in dieselbe Hierarchie wie das Verzeichnisjetty-appgestellt. Dies ist das Verzeichnis, in dem sich unsere Webanwendung befindet.

7.2. Grundlegende Bereitstellung

Lassen Sie uns unser WAR mit Jetty-Runner bereitstellen:

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

Dieser Befehl erstellt genau wie das Maven-Plugin eine Jetty-Instanz und stellt die bereitgestellte WAR für sie bereit. Der WAR-Pfad kann ein absoluter oder ein relativer Pfad sein.

Wir können diese Anwendung mithttp://localhost:8080 laden.

7.3. Mit Kontextpfad bereitstellen

So stellen Sie den Kontext wie zuvor unter/jettybereit:

java -jar jetty-runner-9.4.0.M1.jar --path /jetty jetty-app/target/jetty-app.war

Zugänglich überhttp://localhost:8080/jetty.

7.4. Am angegebenen Port bereitstellen

So stellen Sie auf einer bestimmten Portnummer bereit:

java -jar jetty-runner-9.4.0.M1.jar --port 9090 jetty-app/target/jetty-app.war

Zugänglich überhttp://localhost:9090.

7.5. Stellen Sie mehrere WARs bereit

Um mehrere WARs mit demselben Befehl bereitzustellen, verwenden wir das Argument–path, um jedes eindeutig zu machen:

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

Wir würden dann überhttp://localhost:8080/one aufone.war und überhttp://localhost:8080/two auftwo.war zugreifen.

8. Bereitstellung mit dem Cargo Maven Plugin

Cargo ist eine vielseitige Bibliothek, mit der wir verschiedene Arten von Anwendungscontainern auf standardmäßige Weise bearbeiten können.

8.1. Einrichtung der Frachtbereitstellung

In diesem Abschnitt sehen wir uns an, wieuse Cargo’s Maven plugin to deploy a WAR to Jetty ausgeführt werden. In diesem Fall stellen wir eine WAR für eine Jetty 9.x-Instanz bereit.

Um den gesamten Prozess in den Griff zu bekommen, erstellen wir zunächst eine neue Java-Webanwendung über die Befehlszeile:

mvn archetype:generate -DgroupId=com.example -DartifactId=cargo-deploy
  -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false

Dadurch wird eine vollständige Java-Webanwendung im Verzeichniscargo-deployerstellt. Wenn wir diese Anwendung so wie sie ist erstellen, bereitstellen und laden, werdenHello World! im Browser gedruckt.

Da unsere Webanwendung keine Servlets enthält, ist die Dateiweb.xmlehr einfach. Navigieren Sie also zum OrdnerWEB-INF unseres neu erstellten Projekts und erstellen Sie einenweb.xml, wenn dieser noch nicht automatisch mit folgendem Inhalt erstellt wurde:




    cargo-deploy
    
        index.jsp
    

Damit Maven Frachtbefehle erkennen kann, ohne den vollständig qualifizierten Namen einzugeben, müssen wir das Fracht-Maven-Plugin in einer Plugin-Gruppe insettings.xml.von Maven hinzufügen

Fügen Sie als unmittelbares untergeordnetes Element des Elements root<settings></settings>Folgendes hinzu:


    org.codehaus.cargo

8.2. Lokale Bereitstellung

In diesem Unterabschnitt bearbeiten wir unserepom.xml, um sie an unsere neuen Bereitstellungsanforderungen anzupassen.

Fügen Sie das Plugin wie folgt hinzu:


    
        
            org.codehaus.cargo
            cargo-maven2-plugin
            1.5.0
            
                
                    jetty9x
                    installed
                    Insert absolute path to jetty 9 installation
                
                
                    existing
                    Insert absolute path to jetty 9 installation
                
            
       
    

Beachten Sie, dass wirexplicitly define the packaging as a WAR, ohne dies wird unser Build fehlschlagen. In der Plugins Sektion fügen wir dann das cargo maven2 Plugin hinzu.

Die neueste Version zum Zeitpunkt des Schreibens ist1.5.0. Die neueste Version ist jedoch immerhere zu finden. Zusätzlich fügen wir einen Konfigurationsabschnitt hinzu, in dem wir Maven mitteilen, dass wir den Jetty-Container verwenden, sowie eine vorhandene Jetty-Installation.

Indem Sie den Containertyp aufinstalled setzen, teilen wir Maven mit, dass auf dem Computer eine Jetty-Instanz installiert ist, und geben die absolute URL für diese Installation an.

Indem Sie den Konfigurationstyp aufexisting setzen, teilen wir Maven mit, dass ein vorhandenes Setup vorhanden ist und keine weitere Konfiguration erforderlich ist.

Die Alternative wäre, cargo anzuweisen, die angegebene Jetty-Version unter Angabe einer URL herunterzuladen und einzurichten. Unser Fokus liegt jedoch aufWAR deployment.

Es ist erwähnenswert, dass unabhängig davon, ob wir Maven 2.x oder Maven 3.x verwenden, das Cargo maven2-Plugin für beide funktioniert.

Wir können unsere Anwendung jetzt installieren, indem wir Folgendes ausführen:

mvn install

und implementieren Sie es durch Ausführen von:

mvn cargo:deploy

Wenn in der Maven- und Jetty-Konsole alles gut läuft, sollten wir unsere Webanwendung durch Laden vonhttp://localhost:8080/cargo-deploy. ausführen können

Wenn wir den Ordner$JETTY_HOME/webapps überprüfen, finden wir eine Bereitstellungsdeskriptordatei oder eine zuvor als Kontextdatei bezeichnete Datei mit dem Namencargo-deploy.xml, die von der Fracht erstellt wurde.

8.3. Remote-Bereitstellung

Standardmäßig bietet Jetty keine Möglichkeiten für die Remote-Bereitstellung. Um Jetty eine solche Unterstützung hinzuzufügen, verwendet Cargo die WebanwendungJetty remote deployer.

Dies bedeutet, dass wir eine von den Cargo-Entwicklern vorab erstellte WAR-Datei für Webanwendungen herunterladen und diese auf dem Ziel-Stegcontainer bereitstellen müssen.

Jedes Mal, wenn wir mit dem Cargo Maven-Plugin eine Bereitstellung auf diesem Remoteserver durchführen möchten, wird eine HTTP-Anforderung an die Bereitstellungsanwendung auf dem Remoteserver mit unserem WAR zur Bereitstellung gesendet.

Dieser Remote-Bereitsteller befindet sich inhere. Gehen Sie zum Abschnitttools und laden Sie den WARcargo-jetty-7-and-onwards-deployerherunter.

Sicherheitsüberlegungen

Wir müssen einsecurity realm in der Anlegestelle einrichten, bevor dies zur Authentifizierung funktionieren kann. Erstellen Sie eine Datei mit dem Namenrealm.properties im Verzeichnis$JETTY_HOME/etcdes Remote-Jetty-Servers. Der Dateiinhalt ist:

admin:password,manager

admin ist der Benutzername, unter dem der Client auf die gesicherten Apps zugreifen kann,password ist das Kennwort undmanager ist die Rolle, die die Clients besitzen müssen, bevor sie Zugriff erhalten.

Wir müssen auch unsere Sicherheitsanforderungen in der Bereitstellungsanwendung deklarieren. Wir werden die von der Jetty-Downloadseite heruntergeladene WAR-Datei entpacken, einige Änderungen vornehmen und sie wieder in eine WAR-Datei packen.

Gehen Sie nach dem Entpacken zuWEB-INF/web.xml und kommentieren Sie den XML-Code mit dem KommentarUncomment in order to activate securityaus. Oder platzieren Sie dort den folgenden Code:


    
        Jetty Remote Deployer
        /*
    
    
        manager
    



    BASIC
    Test Realm

Bereitstellen des Bereitstellers

Wir können die App jetzt wieder in eine WAR packen und an einen beliebigen Ort auf dem Remote-Server kopieren. Wir werden es dann zum Steg bringen.

Während der Bereitstellung ist es am besten, eindeployment descriptor file zu verwenden, damit wir einsecurityHandler erstellen und einloginService an dieses übergeben können. Alle gesicherten Anwendungen müssen über einen Anmeldedienst verfügen, sonst kann Jetty sie nicht bereitstellen.

Lassen Sie uns nun eine Kontextdatei in$JETTY_HOME/webapps der Remote-Jetty-Instanz erstellen. Beachten Sie dabei die Regeln für die Benennung der Kontextdatei. Machen Sie es den gleichen Namen wie die WAR:




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

Starten Sie den Remote-Anlegestellen-Server. Wenn alles gut läuft, sollten wirhttp://localhost:8080/cargo-jetty-deployer. laden können. Dann sollten wir Folgendes sehen können:

HTTP ERROR 400

Problem accessing /cargo-jetty-deployer/. Reason:

    Command / is unknown

Bereitstellen von WAR auf Remote Jetty

Für eine Remote-Bereitstellung müssen wir nur unseren Konfigurationsabschnitt vonpom.xml ändern. Remote-Bereitstellung bedeutet, dass wir keine lokale Installation von Jetty haben, sondern über authentifizierten Zugriff auf die auf dem Remote-Server ausgeführte Deployer-App verfügen.

Ändern wir also diepom.xml so, dass der Konfigurationsabschnitt folgendermaßen aussieht:


    
        jetty9x
        remote
    
    
        runtime
        
      127.0.0.1
            8080
            admin
            password
        
    

Dieses Mal ändern wir den Containertyp voninstalled inremote und den Konfigurationstyp vonexisting inruntime. Zuletzt fügen wir der Konfiguration Hostnamen-, Port- und Authentifizierungseigenschaften hinzu.

Bereinigen Sie das Projekt:

mvn clean

es installieren:

mvn install

Stellen Sie es schließlich bereit:

mvn cargo:deploy

Das ist es.

9. Bereitstellung über Eclipse

Mit Eclipse können wir Server einbetten, um die Bereitstellung von Webprojekten in den normalen Workflow einzufügen, ohne die IDE verlassen zu müssen.

9.1. Anlegestelle in Eclipse einbetten

Wir können eine Jetty-Installation in Eclipse einbetten, indem wirwindow Element aus der Taskleiste und dannpreferences aus dem Dropdown-Menü auswählen.

Im linken Bereich des angezeigten Fensters finden Sie ein Baumgitter mit Präferenzelementen. Wir können dann zu Eclipse → Servern navigieren oder einfach Server in die Suchleiste eingeben.

Wir wählen dann das Jetty-Verzeichnis, falls es noch nicht für uns geöffnet ist, und wählen die von uns heruntergeladene Jetty-Version.

Auf der rechten Seite des Panels wird eine Konfigurationsseite angezeigt, auf der wir die Aktivierungsoption auswählen, um diese Jetty-Version zu aktivieren und zum Installationsordner zu navigieren.

In den Screenshots wird Steg 7.x durch die von uns konfigurierte Version des Stegs ersetzt.

image

 

Wir übernehmen Änderungen und wenn wir das nächste Mal die Serveransicht über das Untermenü von Eclipse öffnen → Ansicht anzeigen, ist der neu konfigurierte Server vorhanden und wir können Anwendungen darauf starten, stoppen und bereitstellen.

9.2. Bereitstellen einer Webanwendung in Embedded Jetty

Um eine Webanwendung für die eingebettete Jetty-Instanz bereitzustellen, muss sie in unserem Arbeitsbereich vorhanden sein.

Öffnen Sie die Ansichtserversim Fenster → Ansicht anzeigen und suchen Sie nach Servern. Wenn es geöffnet ist, können wir einfach mit der rechten Maustaste auf den von uns konfigurierten Server klicken undadd deployment aus dem angezeigten Kontextmenü auswählen.

image

Öffnen Sie im angezeigten DialogfeldNew Deployment die Dropdown-Listeproject und wählen Sie das Webprojekt aus.

Unter dem KombinationsfeldProject befindet sich ein AbschnittDeploy Type, wenn wirExploded Archive(development mode),our changes in the application will be synced live without having to redeploy auswählen. Dies ist die beste Option während der Entwicklung, da es sehr effizient ist.

image

 

Wenn SiePackaged Archive(production mode) auswählen, müssen wir jedes Mal, wenn wir Änderungen vornehmen, diese erneut bereitstellen und im Browser anzeigen. Dies ist nur für die Produktion am besten geeignet, Eclipse macht es jedoch genauso einfach.

9.3. Bereitstellen einer Webanwendung an einem externen Speicherort

Wir entscheiden uns normalerweise für die Bereitstellung einer WAR über Eclipse, um das Debuggen zu vereinfachen. Es kann vorkommen, dass wir möchten, dass es an einem anderen Ort als den von den eingebetteten Servern von Eclipse verwendeten bereitgestellt wird.

In den meisten Fällen ist unser Produktionsserver online und wir möchten die Webanwendung aktualisieren.

Wir können dieses Verfahren umgehen, indem wir es im Produktionsmodus bereitstellen, dieDeploy Location im DialogfeldNew Deployment notieren und von dort aus die WAR auswählen.

Während der Bereitstellung können Sie anstelle eines eingebetteten Servers die Option<Externally Launched> in der Ansichtserversneben der Liste der eingebetteten Server auswählen. Wir navigieren zum Verzeichnis$JETTY_HOME /webapps einer externen Jetty-Installation.

10. Bereitstellung von IntelliJ IDEA

Um eine Webanwendung auf Jetty bereitzustellen, muss sie vorhanden und bereits heruntergeladen und installiert sein.

10.1. Lokale Konfiguration

Öffnen Sie das MenüRunund klicken Sie auf die OptionenEdit Configurations.

Wenn Sie im linken Bereich nachJetty Server suchen, klicken Sie auf das Pluszeichen im Menü, suchen Sie nachJetty und wählen SieLocal aus. Geben Sie in das FeldnameJetty 9 ein.

Klicken Sie auf die SchaltflächeConfigure… und navigieren Sie im FeldJetty Home zum Ausgangsort Ihrer Installation und wählen Sie ihn aus.

Stellen Sie die SeiteStartup optional aufhttp://localhost:8080/ undHTTP port: 8080 ein und ändern Sie den Port entsprechend.

Gehen Sie zur RegisterkarteDeployment und klicken Sie auf das Symbol +, wählen Sie das Artefakt aus, das Sie dem Server hinzufügen möchten, und klicken Sie auf OK

10.2. Remote-Konfiguration

Befolgen Sie die gleichen Anweisungen wie für lokale Jetty-Konfigurationen, aber auf der Registerkarte Server müssen Sie den Remote-Speicherort der Installation eingeben.

11. Fazit

In diesem Artikel haben wir die verschiedenen Möglichkeiten zum Bereitstellen einer WAR-Datei auf dem Jetty-Webserver ausführlich behandelt.