JettyをEclipseと連携させる(ホットデプロイ編)

前回の記事 REST アプリケーションを Jetty で動かす では Eclipse でビルドした WAR ファイルを手動で Jetty にデプロイ 配備 する方法を説明しました。

実際の開発では動作確認のために何度もビルド→デプロイをすることになりますので 手動で WAR ファイルのコピーを繰り返していては疲れてしまいます。

今回は Jetty Eclipse を連携させてビルドからデプロイまで自動化する方法を紹介します。

Jetty Eclipse を連携させるためのプラグインもありますが 今回はプラグインを使わずに Jetty Eclipse を連携させていきます。Buildship Gradle プロジェクトの場合 Gradle タスクで連携させたほうが便利だからです。

ホットデプロイ

アプリケーション サーバー サーブレット コンテナ のプロセスを停止させず稼働状態のまま WAR ファイルを置き換えて再ロードする機能をホットデプロイといいます。

Jetty はデフォルトでホットデプロイが有効になっていますので Jetty プロセスを稼働したままでも WAR ファイルを上書きするだけで Web アプリケーションを新しいものに置き換えることができます。

以前の記事 Jersey REST アプリケーションを作る で作成した build​.gradle では WAR ファイルはプロジェクトの build​¥libs に出力されるようになっていました。まずは build​.gradle にタスクを追加して WAR ファイルが Jetty webapps フォルダーにコピーされるようにします。

WARファイルをデプロイするタスク
task deploy(type: Copy, depends​On: war) { set​Group('build') from 'build​/libs' into 'c:/jetty-9.4.11/webapps' }

このタスクを build​.gradle に追加して Gradle Tasks ビューをリフレッシュすると build の中に deploy という新しいタスクが表示されます。これを右クリックして Run Gradle Tasks を実行します。

この deploy タスクは war タスクに依存させていますので自動的に WAR ファイルのリビルドもおこなわれ そして build​¥libs の中身が C:¥jetty-9.4.11¥webapps にコピーされます。

WAR ファイルが C:¥jetty-9.4.11¥webapps にコピーされると Jetty プロセスが WAR ファイルが更新されたことを検出して 自動的に WAR ファイルを再読み込みしてくれます。

WAR ファイルの出力先を環境変数で指定する

前述の deploy タスクでは WAR ファイルのコピー先を c:/jetty-9.4.11/webapps とフルパスで記述していました。これでは開発環境に依存してしまいますのであまり良くないですね。環境変数でコピー先を指定できるようにしてみましょう。

build​.gradle deploy タスクを以下のように書き換えます。これで 環境変数 JETTY_BASE で指定されているフォルダーの webapps サブフォルダーに build​¥libs 内のファイルがコピーされるようになります。

WARファイルをデプロイするタスク(環境変数対応)
task deploy(type: Copy, depends​On: war) { set​Group('build') from 'build​/libs' into System​.getenv()['JETTY_BASE'] + '/webapps' }

build​.gradle 全体は以下の通りです。

build​.gradle
apply plugin: 'eclipse' apply plugin: 'java' apply plugin: 'war' def default​Encoding = 'UTF-8' tasks​.with​Type(Abstract​Compile).each { it​.options​.encoding = default​Encoding } tasks​.with​Type(Groovy​Compile).each { it​.groovy​Options​.encoding = default​Encoding } javadoc { options​.char​Set = default​Encoding options​.encoding = default​Encoding options​.member​Level = Javadoc​Member​Level​.PUBLIC } tasks​.with​Type(Java​Compile) { options​.compiler​Args << "-parameters" } repositories { maven​Central() jcenter() } dependencies { compile file​Tree(dir: 'lib', includes: ['**/*.jar'], excludes: ['**/*-sources​.jar', '**/*-javadoc​.jar']) provided​Compile 'javax​.servlet:javax​.servlet-api:3.1.0' provided​Compile 'org​.glassfish​.jersey​.bundles:jaxrs-ri:2.0.1' } default​Tasks 'clean', 'build', 'war' war { archive​Name = "${archives​Base​Name}.war" } task deploy(type: Copy, depends​On: war) { set​Group('build') from 'build​/libs' into System​.getenv()['JETTY_BASE'] + '/webapps' } task initialize​Project​Files { do​Last { if(file('src​/main​/java​/Library​.java').exists()) { file('src​/main​/resources').mkdirs() file('src​/main​/webapp​/WEB-INF').mkdirs() file('lib').mkdir() delete "src​/test" delete "src​/main​/java​/Library​.java" } } } tasks​.eclipse​Classpath​.depends​On(clean​Eclipse​Classpath) tasks​.eclipse​Classpath​.depends​On(initialize​Project​Files) tasks​.clean​Eclipse​Classpath​.must​Run​After(initialize​Project​Files)

環境変数は Windows のシステムのプロパティで設定します。Win + R を押して ファイル名を指定して実行 ウィンドウを表示します。名前に sysdm​.cpl と入力して OK をクリックします。

システムのプロパティが表示されるので 詳細設定 タブに切り替えて 環境変数 をクリックします。

環境変数を設定するウィンドウが表示されたら 新規 をクリックします。

新しいユーザー変数を設定します。変数名は JETTY_BASE 変数値は Jetty のインストール フォルダーを指定します。OK をクリックします。ディレクトリの参照... ボタンを押してマウスでフォルダーを選択することもできます。

環境変数 JETTY_BASE が追加されていることを確認して OK をクリックします。

これで Gradle タスク deploy を実行すると 環境変数 JETTY_BASE で指定した場所にある webapps フォルダーに WAR ファイルがコピーされるようになりました。

ソースコード保存時に自動で Gradle タスクを実行する

Gradle タスク deploy を実行することで WAR ファイルのビルドと Jetty へホットデプロイができるようになりました。

次はソースコードの変更 保存 したときに 自動的に deploy タスクが実行されるようにしてみましょう。

Eclipse Project Explorer でプロジェクトを選択して Properties をクリックします。

プロジェクトのプロパティが表示されます。左側のツリーから Builders を選択して 右側の New​... をクリックします。

外部ツールを選択するウィンドウが表示されます。Program を選択して OK をクリックします。

外部ツールの設定ウィンドウが表示されます。Location 欄の Browse Workspace​... をクリックします。

外部ツールとして起動するプログラムを選択するウィンドウが表示されます。gradlew​.bat を選択して OK をクリックします。gradlew​.bat はプロジェクトのルートディレクトリに存在しています

次に Working Directory 欄の Browse Workspace​... をクリックします。

プロジェクト名を選択して OK をクリックします。これで プロジェクトのルートディレクトリが Gradle タスク実行時の作業ディレクトリになります。

Arguments 欄に実行する Gradle タスクの名前を入力します。今回は deploy ですね。

Build Options タブに切り替えます。After a "Clean" のチェックを外して During auto builds のチェックをオンにします。最後に OK をクリックします。

Environment タブで環境変数を設定することもできます。Windows のシステムのプロパティで環境変数を設定している場合はここで設定する必要はありません。

新しいビルダー設定が追加されたことを確認して Apply and Close をクリックします。

以上で設定は完了です。

ソースコードを編集して Ctrl + S などの保存操作をすると 自動的に Gradle タスクが開始されます。

WAR ファイルのデプロイが自動化されたことで より一層 プログラムの実装に集中することができますね。

次回は Jetty Web アプリケーションをデバッグ実行する方法を紹介します。

この記事を共有しませんか?