JettyにWebアプリケーションをデプロイする

1概要

この記事では、Jetty Webサーバーの概要を説明した後、WARファイルをデプロイするためのさまざまな方法について説明します。

Jetty は、オープンソースのJava HTTP Webサーバーおよびサーブレットコンテナです。 Jettyは、Javaエコシステムのマシン間通信で一般的に使用されています。

2プロジェクト設定

最新バージョンのJettyは、http://www.eclipse.org/jetty/download.html[このリンク]からいつでもダウンロードできます。 Mavenを使用してコマンドラインから非常に基本的なJava Webアプリケーションを作成します。これを例に使用します。

この記事では、現在最新のJetty 9.xを使用しています。

コンソールに行き、選択した場所に移動して次のコマンドを実行しましょう。

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

このコマンドは、現在の場所の新しい jetty-app フォルダ内に完全なJava Webアプリケーションを作成します。それはMavenを使ってJavaアプリケーションを作成する多くの方法のうちの1つにすぎず、それは私たちの目的に適しています。

WARファイルを扱うことになるので、プロジェクトのルートに移動してビルドしましょう。

cd jetty-app

Mavenを使った構築

mvn package

その後、 jetty-app.war がロケーション jetty-app/target/jetty-app.war に作成されます。

3桟橋の構造

  • コンテキストパス ** サーバーのアドレスからの相対的な位置を指し、Webアプリケーションの名前を表します。

たとえば、Webアプリケーションが $ JETTY HOME \ webapps \ myapp ディレクトリの下に置かれている場合、それはURL http://localhost/myapp によってアクセスされ、そのコンテキストパスは /myapp__になります。

  • 戦争 ** Webアプリケーションディレクトリ階層をZIP形式でパッケージ化したファイルの拡張子で、Web Archiveの略です。 Java Webアプリケーションは通常、デプロイ用のWARファイルとしてパッケージされています。 WARファイルは、コマンドラインまたはEclipseのようなIDEを使って作成できます。

** 4 WARをコピーしてデプロイする

WebアプリケーションをJettyサーバーにデプロイする最も簡単な方法は、おそらくWARファイルを $ JETTY HOME/webapps__ディレクトリにコピーすることです。

コピーしたら、 $ JETTY HOME__に移動して次のコマンドを実行し、サーバーを起動します。

java -jar start.jar

Jettyは起動時に ` $ JETTY HOME/webapps` ディレクトリをスキャンしてWebアプリケーションをデプロイします。私たちの新しいアプリは /jetty-app__コンテキストでデプロイされます。

ブラウザから http://localhost:8080/jetty-app というURLを読み込むと、 Hello world! で実行されているアプリが画面に表示されます。

5コンテキストファイルを使用したデプロイ

Jetty Webサーバは、コンテキストファイルを作成することによって、ファイルシステム内の任意の場所にあるWebアーカイブを デプロイする 方法を提供します。

このようにして、WARファイルがデスクトップ上にある場合、またはMavenがパッケージを配置する jetty-app/target に保存することを選択した場合でも、 $ JETTY HOME/webapps__内にコンテキストファイルを作成するだけで済みます。

先ほどデプロイした jetty-app.war webapps から削除してアンデプロイしましょう。次に、次のコードを使用して jetty-app.xml を作成し、 webapps 内に配置します。

<?xml version="1.0"  encoding="ISO-8859-1"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN"
  "http://www.eclipse.org/jetty/configure.dtd">
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
    <Set name="contextPath">/jetty</Set>
    <Set name="war">absolute/path/to/jetty-app.war</Set>
</Configure>
  • このコンテキストファイルは、XMLファイル拡張子を付けて、WAR ** と同じ名前でなければなりません。 contextPath 属性を /jetty に設定しました。これは、Webアプリに http://localhost:8080/jetty というURLからアクセスすることを意味します。

コンテキストパスをカスタマイズするこの機能は、JettyでWARをデプロイするというコンテキストファイルアプローチの大きな利点の1つです。これは、一部のアプリ名はこの目的には便利ではない場合があるためです。

6. Jetty Mavenプラグインを使用したデプロイ

6.1. デフォルト展開

Jetty Mavenプラグインを使用すると、Java Webアプリケーションを構築しながら迅速なテストと反復を行うことができます。それを使用してアプリケーションをデプロイして実行できるようにするには、 pom.xml にプラグインを追加するだけです。

<plugin>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-maven-plugin</artifactId>
    <version>9.3.11.v20160721</version>
</plugin>

最新版はhttp://search.Maven.org/#search%7Cga%7C1%7Ca%3A%22jetty-Maven-plugin%22[このMavenリンク]をたどることで見つけることができます。

次のステップを実行する前に、ポート 8080 で実行中のJettyのインスタンスが停止していることを確認する必要があります。

プラグインを追加した後でアプリをデプロイするには、 pom.xml があるルートに移動して次のコマンドを実行します。

mvn jetty:run

このコマンドは新しいjettyインスタンスを作成し、プラグインはそれにアプリをデプロイします。 __http://localhost:8080をロードすることでアクセスできます。

jetty Mavenプラグインは、Webプロジェクトの変更を継続的にスキャンして再デプロイします。

6.2. ContextPath を変更する

前のサブセクションから、アプリは / contextの下にデプロイされました。

しかし、以前のように /jetty などの特定のコンテキストパスでデプロイしたい場合は、プラグインを別の方法で設定する必要があります。

プラグイン宣言を次のXMLに変更します。

<plugin>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-maven-plugin</artifactId>
    <version>9.3.11.v20160721</version>
    <configuration>
        <webApp>
            <contextPath>/jetty</contextPath>
        </webApp>
    </configuration>
</plugin>

展開をさらにカスタマイズするために構成ブロックを追加したことに注目してください。必要に応じて、このブロック内にいくつかの構成オプションを配置することができます。

これらの変更後、以前と同じようにプラグインを再実行して http://localhost:8080/jetty を介してアプリにアクセスできます。

6.3. ポートを変更する

直面する可能性があるシナリオは、使用中のポートの例外です。本番用に 8080 ポートで実行されているjettyインスタンスがあるかもしれませんが、まだ開発段階にあり、Mavenプラグインを使用したデプロイに伴う反復の容易さから利益を得たいと考えています。

そのような場合は、テストサーバーを別のポートで実行する必要があります。プラグイン設定を次のXMLに変更しましょう。

<configuration>
    <webApp>
        <contextPath>/jetty</contextPath>
    </webApp>
    <httpConnector>
        <port>8888</port>
    </httpConnector>
</configuration>

Mavenプラグインを再実行すると、 http://localhost:8888/jetty からアプリにアクセスできるようになります。

Jetty Mavenプラグインを使用すると、Jettyのインスタンスをインストールして実行する必要がないことは注目に値します。むしろ、それはそれ自身の桟橋インスタンスを作成します。

7. Jetty Runnerを使用したデプロイ

Jetty Mavenプラグインと同じように、Jettyランナーは、Webアプリケーションを迅速に展開して実行する方法を提供します。 Jetty-Runnerを使用すると、Jettyサーバーの別のインスタンスをインストールして実行する必要もありません。

7.1. 桟橋ランナーセットアップ

Webアプリケーションの迅速な展開と実行にJetty-Runnerを使用するには、このhttp://search.Maven.org/#search%7Cga%7C1%7Ca%3A%22jetty-runner%22を参照して最新バージョンをダウンロードできます。[Maven link]

jetty-runnerでは、ダウンロードしたjarファイルを好きな場所に配置するだけでよく、Webアーカイブへのファイルシステムパスを用意するだけです。

コマンドラインから設定パラメータを渡したり、さまざまなコンテキストで多数のアプリケーションをデプロイしたり、1つのコマンドでさまざまなポートにバインドしたりできます。

私のjetty-runner jarを jetty-app ディレクトリと同じ階層に配置しました。それが私たちのWebアプリケーションを含むディレクトリです。

7.2. 基本配置

jetty-runnerを使用してWARをデプロイしましょう。

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

このコマンドは、Mavenプラグインの場合と同様に、Jettyインスタンスを作成し、提供されたWARをそれにデプロイします。 WARパスは絶対パスでも相対パスでもかまいません。

このアプリケーションは http://localhost:8080 を使ってロードできます。

7.3. コンテキストパスでデプロイ

以前のように /jetty コンテキストでデプロイするには

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

http://localhost:8080/jetty からアクセスできます。

7.4. 特定のポートにデプロイ

特定のポート番号にデプロイするには

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

http://localhost:9090 からアクセスできます。

7.5. 複数のWARをデプロイする

同じコマンドで複数のWARをデプロイするには、 – path 引数を使用してそれぞれを一意にします。

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

その後、 http://localhost:8080/one を介して one.war に、 http://localhost:8080/two を介して two.war にアクセスします。

8 Cargo Mavenプラグインを使用してデプロイする

Cargo は、さまざまな種類のアプリケーションコンテナを標準的な方法で操作することを可能にする多用途のライブラリです。

8.1. 貨物配置のセットアップ

このセクションでは、CargoのMavenプラグインを使用してJettyにWARをデプロイする方法について説明します。この場合は、Jetty 9.xインスタンスにWARをデプロイします。

プロセス全体をしっかりと把握するために、最初からコマンドラインから新しいJava Webアプリケーションを作成します。

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

これにより、 cargo-deploy ディレクトリに完全なJava Webアプリケーションが作成されます。このアプリケーションをそのまま構築、デプロイ、ロードすると、ブラウザに Hello World! と表示されます。

Webアプリケーションにはサーブレットが含まれていないので、 web.xml ファイルは非常に基本的なものになります。新しく作成したプロジェクトの WEB-INF フォルダに移動し、次の内容で web.xml が自動作成されていない場合は作成します。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="http://Java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://Java.sun.com/xml/ns/javaee
      http://Java.sun.com/xml/ns/javaee/web-app__3__0.xsd" id="WebApp__ID" version="3.0">

    <display-name>cargo-deploy</display-name>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

完全な名前を入力しなくてもMavenが貨物のコマンドを認識できるようにするには、Mavenの__settings.xmlのプラグイングループに貨物のMavenプラグインを追加する必要があります。

ルート <settings> </settings> 要素の直接の子として、これを追加します。

<pluginGroups>
    <pluginGroup>org.codehaus.cargo</pluginGroup>
</pluginGroups>

8.2. ローカル展開

このサブセクションでは、新しいデプロイメント要件に合わせて pom.xml を編集します。

次のようにプラグインを追加します。

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.cargo</groupId>
            <artifactId>cargo-maven2-plugin</artifactId>
            <version>1.5.0</version>
            <configuration>
                <container>
                    <containerId>jetty9x</containerId>
                    <type>installed</type>
                    <home>Insert absolute path to jetty 9 installation</home>
                </container>
                <configuration>
                    <type>existing</type>
                    <home>Insert absolute path to jetty 9 installation</home>
                </configuration>
            </configuration>
       </plugin>
    </plugins>
</build>
  • 明示的にパッケージングをWAR ** として定義していることに注意してください。これがなければ、ビルドは失敗します。プラグインセクションで、次に貨物maven2プラグインを追加します。

これを書いている時点での最新版は 1.5.0 です。ただし、最新バージョンは常にhttps://codehaus-cargo.github.io/cargo/Downloads.html[ここ]にあります。

さらに、私たちがMavenにJettyコンテナと既存のJettyインストールを使用していることを伝える設定セクションを追加しました

コンテナタイプを installed に設定することで、マシンにJettyインスタンスがインストールされたことをMavenに伝え、このインストールへの絶対URLを提供します。

設定タイプを existing に設定することで、使用している既存の設定があり、それ以上の設定は必要ないことをMavenに伝えます。

別の方法は、URLを指定して指定されたJettyバージョンをダウンロードして設定するように貨物に指示することです。しかし、私たちの焦点は WARデプロイメント です。

Maven 2.xとMaven 3.xのどちらを使用している場合でも、貨物maven2プラグインは両方に使用できます。

次のコマンドを実行してアプリケーションをインストールできます。

mvn install

次のコマンドを実行してデプロイします。

mvn cargo:deploy

すべてがMavenとJettyのコンソールでうまくいけば、 http://localhost:8080/cargo-deploy . をロードすることでWebアプリケーションを実行できるはずです。

$ JETTY HOME/webapps フォルダーを確認すると、デプロイメント記述子ファイル、またはcargoによって作成された cargo-deploy.xml__という名前のコンテキストファイルが見つかります。

8.3. リモート展開

デフォルトでは、Jettyにはリモート展開の可能性はありません。 Jettyにそのようなサポートを追加するために、Cargoは Jettyリモートデプロイヤ Webアプリケーションを使用します。

つまり、Cargo開発者によって事前に作成されたWebアプリケーションWARをダウンロードし、このWARをターゲットのJettyコンテナにデプロイする必要があります。

Cargo Mavenプラグインを使用してこのリモートサーバーにデプロイするたびに、デプロイ用のWARとともにリモートサーバー上のデプロイヤアプリケーションにHTTPリクエストが送信されます。

このリモートデプロイヤはhttps://codehaus-cargo.github.io/cargo/Downloads.html[ここ]にあります。 tools セクションに進んで cargo-jetty-7-and-onwards-deployer WARをダウンロードしてください。

セキュリティ上の考慮事項

認証を目的として、これが機能するようになる前に、Jettyに セキュリティレルム を設定する必要があります。リモートJettyサーバーの $ JETTY HOME/etc ディレクトリーに realm.properties__というファイルを作成します。ファイルの内容は次のとおりです。

admin:password,manager

admin はクライアントがセキュアアプリにアクセスするためのユーザー名、password __はパスワード、managerはアクセスを許可される前にクライアントが持たなければならない役割です。

また、セキュリティ要件をデプロイヤアプリケーションで宣言する必要があります。 JettyのダウンロードページからダウンロードしたWARを解凍し、いくつかの変更を加えてWARにパックします。

解凍後、 WEB-INF/web.xml に進んで、security コメントをアクティブにするために UncommentでXMLコードのコメントを外します。または、次のコードをそこに配置してください。

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Jetty Remote Deployer</web-resource-name>
        <url-pattern>/** </url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>manager</role-name>
    </auth-constraint>
</security-constraint>

<login-config>
    <auth-method>BASIC</auth-method>
    <realm-name>Test Realm</realm-name>
</login-config>

デプロイヤのデプロイ

これで、アプリをWARにパックしてリモートサーバーの任意の場所にコピーできます。それをJettyにデプロイします。

デプロイメント中は、 securityHandler を作成して loginService を渡すことができるように デプロイメント記述子ファイル を使用するのが最善です。

セキュリティ保護されたすべてのアプリケーションはログインサービスを持っている必要があります。

それでは、リモートJettyインスタンスの $ JETTY HOME/webapps__にコンテキストファイルを作成しましょう。コンテキストファイルの命名規則を覚えておいてください。 WARと同じ名前にします。

<?xml version="1.0"  encoding="ISO-8859-1"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN"
  "http://www.eclipse.org/jetty/configure.dtd">
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
    <Set name="contextPath">/deployer</Set>
    <Set name="war">absolute/path/to/cargo-jetty-deployer.war</Set>
    <Get name="securityHandler">
        <Set name="loginService">
            <New class="org.eclipse.jetty.security.HashLoginService">
                <Set name="name">Test Realm</Set>
                <Set name="config"><SystemProperty name="jetty.home"
                   default="."/>/etc/realm.properties</Set>
            </New>
        </Set>
    </Get>
</Configure>

リモートのJettyサーバを起動して、すべてうまくいけば、__http://localhost:8080/cargo-jetty-deployerをロードできるはずです。その後、次のように表示されるはずです。

HTTP ERROR 400

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

    Command/is unknown

リモートJettyへのWARのデプロイ

リモートデプロイを実行するには、__pom.xmlの設定セクションを変更するだけです。リモートデプロイとは、Jettyをローカルにインストールしているのではなく、リモートサーバー上で実行されているデプロイヤアプリケーションへの認証されたアクセスを持っていることを意味します。

では、構成セクションが次のようになるように pom.xml を変更しましょう。

<configuration>
    <container>
        <containerId>jetty9x</containerId>
        <type>remote</type>
    </container>
    <configuration>
        <type>runtime</type>
        <properties>
      <cargo.hostname>127.0.0.1</cargo.hostname>
            <cargo.servlet.port>8080</cargo.servlet.port>
            <cargo.remote.username>admin</cargo.remote.username>
            <cargo.remote.password>password</cargo.remote.password>
        </properties>
    </configuration>
</configuration>

今回は、コンテナタイプを installed から remote に、設定タイプを existing から runtime に変更します。最後に、設定にホスト名、ポート、認証の各プロパティを追加します。

プロジェクトをきれいにする:

mvn clean

それをインストールしてください。

mvn install

最後に、それをデプロイします。

mvn cargo:deploy

それでおしまい。

9 Eclipse からのデプロイ

Eclipseでは、IDEから離れずに通常のワークフローにWebプロジェクトのデプロイメントを追加するためにサーバーを組み込むことができます。

** 9.1. EclipseへのJettyの埋め込み

タスクバーから window 項目を選択してからドロップダウンメニューから preferences を選択することで、JettyインストールをEclipseに埋め込むことができます。

表示されるウィンドウの左側のパネルに設定項目のツリーグリッドがあります。その後、eclipse - > serversに移動するか、検索バーに単にサーバーと入力します。

まだ開いていない場合はJettyディレクトリを選択し、ダウンロードしたJettyバージョンを選択します。

パネルの右側に設定ページが表示されます。ここで、このJettyバージョンをアクティブにしてインストールフォルダを参照するための有効化オプションを選択します。

スクリーンショットから、jetty 7.xは設定したjettyのバージョンに置き換えられます。

リンク:/uploads/Capture-3.png%20707w[]

変更を適用し、次回Eclipseのウィンドウからサーバービューを開くと、 - >サブメニューが表示され、新しく設定されたサーバーが表示され、そこにアプリケーションを起動、停止、デプロイできます。

9.2. Embedded JettyにWebアプリケーションをデプロイする

Webアプリケーションを埋め込みJettyインスタンスにデプロイするには、それが私たちのワークスペースに存在しなければなりません。

ウィンドウ - > show viewから servers ビューを開き、サーバーを探します。

開いたら、設定したサーバを右クリックして、表示されるコンテキストメニューから[ add deployment ]を選択します。

リンク:/uploads/Capture-4-1.png%20853w[]

表示される[ 新しい展開 ]ダイアログボックスから、[ プロジェクト ]ドロップダウンを開き、Webプロジェクトを選択します。

Exploded Archive(開発モード) を選択すると、 Project コンボボックスの下に Deploy Type セクションがあります。 。

リンク:/uploads/Capture-5.png%20586w[]

[アーカイブアーカイブ(プロダクションモード)]を選択すると、変更を加えるたびに再デプロイしてブラウザで表示する必要があります。これは本番環境にのみ最適ですが、それでもEclipseでも同様に簡単です。

9.3. Webアプリケーションを外部の場所に配置する

私たちは通常、デバッグを容易にするためにEclipseを通してWARをデプロイすることを選びます。 Eclipseの組み込みサーバー以外の場所にデプロイしたい場合があるかもしれません。

最も一般的な例は、私たちの本番サーバーがオンラインであり、Webアプリケーションを更新したい場合です。

  • プロダクションモードでデプロイし、 New Deployment ダイアログボックスの Deploy Location に注目し、そこからWARを選択することで、この手順を回避できます。

デプロイ中に、組み込みサーバーを選択する代わりに、組み込みサーバーのリストの横にある servers ビューから <外部起動> オプションを選択できます。外部Jettyインストールの $ JETTY HOME / webapps__ディレクトリに移動します。

10 IntelliJ IDEAからのデプロイ

WebアプリケーションをJettyにデプロイするには、Webアプリケーションが存在し、すでにダウンロードされインストールされている必要があります。

10.1. ローカル設定

Run メニューを開き、 Edit Configurations オプションをクリックします。

左側のパネルで Jetty Server が検索されていない場合は、メニューの+記号をクリックし、 Jetty を検索して Local を選択します。 name フィールドに Jetty 9 を入力します。

Configure …​ ボタンをクリックし、 Jetty Home フィールドでインストールのホームロケーションに移動して選択します。

必要に応じて、 Startup ページを http://localhost:8080/ および HTTP port:8080 に設定し、必要に応じてポートを変更します。

[デプロイメント]タブに移動してシンボルをクリックし、サーバーに追加する案件を選択して[OK]をクリックします。

10.2. リモート設定

ローカルのJetty設定と同じ手順に従いますが、[サーバ]タブで、インストールのリモートロケーションを入力する必要があります。

11結論

この記事では、Jetty WebサーバーにWARファイルをデプロイするためのさまざまな方法について詳しく説明しました。

前の投稿:Hazelcast Jetの紹介
次の投稿:文字列中のCharの出現回数を数える