前回の記事 「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, 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.gradle
の deploy
タスクを以下のように書き換えます。これで、 環境変数 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.gradleapply 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 アプリケーションをデバッグ実行する方法を紹介します。