JettyをEclipseと連携させる (ホットデプロイ編)
  Web, Java, プログラミング

前回の記事ではEclipseでビルドしたWARファイルを手動でJettyにデプロイ(配備)する方法を説明しました。

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

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

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

ホットデプロイ

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

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

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

WARファイルをデプロイするタスク
task deploy(type: Copy, dependsOn: war) { setGroup('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.gradledeployタスクを以下のように書き換えます。これで、環境変数JETTY_BASEで指定されているフォルダーのwebappsサブフォルダーにbuild\libs内のファイルがコピーされるようになります。

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

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

build.gradle
apply plugin: 'eclipse' apply plugin: 'java' apply plugin: 'war' def defaultEncoding = 'UTF-8' tasks.withType(AbstractCompile).each { it.options.encoding = defaultEncoding } tasks.withType(GroovyCompile).each { it.groovyOptions.encoding = defaultEncoding } javadoc { options.charSet = defaultEncoding options.encoding = defaultEncoding options.memberLevel = JavadocMemberLevel.PUBLIC } tasks.withType(JavaCompile) { options.compilerArgs << "-parameters" } repositories { mavenCentral() jcenter() } dependencies { compile fileTree(dir: 'lib', includes: ['**/*.jar'], excludes: ['**/*-sources.jar', '**/*-javadoc.jar']) providedCompile 'javax.servlet:javax.servlet-api:3.1.0' providedCompile 'org.glassfish.jersey.bundles:jaxrs-ri:2.0.1' } defaultTasks 'clean', 'build', 'war' war { archiveName = "${archivesBaseName}.war" } task deploy(type: Copy, dependsOn: war) { setGroup('build') from 'build/libs' into System.getenv()['JETTY_BASE'] + '/webapps' } task initializeProjectFiles { doLast { 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.eclipseClasspath.dependsOn(cleanEclipseClasspath) tasks.eclipseClasspath.dependsOn(initializeProjectFiles) tasks.cleanEclipseClasspath.mustRunAfter(initializeProjectFiles)

環境変数は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アプリケーションをデバッグ実行する方法を紹介します。