数年ぶりにPlay Frameworkを触ろうとしたら変化があったことと、Gradleを使いたいと思ったので、Gradleを使ったプロジェクトの起動までを忘備録として残しておきます。
Play Frameworkは、JavaまたはScalaを使った開発ができるフルスタックのWebアプリケーションフレームワークです。
今回は比較的入りやすい、Javaでのプロジェクトを想定して書いています。
この記事での目標
- Play Frameworkを使うのに必要なツールをインストールする
- Gradleを使ってPlay Frameworkの開発用サーバーを起動する
環境
- macOS Catalina 10.15.2
- HomeBrew
概要
- 必要なツールをインストールする
- Java
- sbt
- Gradle
- プロジェクトを作成する
- テンプレートプロジェクトの作成
- 任意のディレクトリにプロジェクトをダウンロードしたい時は
- Gradleを使用したPlay Frameworkプロジェクトの起動
- build.gradleの設定
- 1.3. Applying the plugin
- 3.1. Adding dependencies
- 4.1. Targeting a Play version
- 4.2. Configuring routes style
- 開発用サーバーで起動する
必要なツールをインストールする
Java
公式の必要環境の情報(https://www.playframework.com/documentation/2.8.x/Requirements)を確認すると、Java SE 1.8 or higher
と表記されているので、Javaの最新版をインストールします。
brew cask install java
sbt
Java、またはScalaを使用したアプリケーション作成に使用するビルドツールです。
公式の必要環境の情報(https://www.playframework.com/documentation/2.8.x/Requirements)にsbt
の記述がありますので、これもインストールします。
brew install sbt
Gradle
主にJava、Scalaをターゲットにしたビルド自動化システムで、プラグインを使うことで色々なフレームワークやJVM言語への対応ができます。公式のプラグイン情報(https://plugins.gradle.org/)を見ると、kotlinやSpring bootのなどのプラグインがあります。
Play Frameworkに関しては、Gradle 5までは本体側に対応があったようですが、Gradle 6からはプラグインでの対応に変更されています。(https://docs.gradle.org/current/userguide/play_plugin.html)
brew install gradle
プロジェクトを作成する
この作業を始める前に、Gradle Play Pluginの公式を確認しましょう。サポートするPlay Frameworkのバージョンが記載されています。
実は、現時点(※2019/12)ではPlay Frameworkの2.6系までしかサポートされていません。
ということで、今回は2.6系の最終バージョンである2.6.25
での作成を目指します。
テンプレートプロジェクトの作成
Play Framework公式の新規プロジェクト作成の解説を確認すると、Java template
とScala template
の2種類の記載があります。
今回はJavaでの開発を目指すため、Java template
の方を使います。
……が、記載されたコマンドをそのまま実行すると、Github上のテンプレートプロジェクトから最新のテンプレートをダウンロードして作成してしまいます。
今回は最新(2019/12時点では2.8.0
)ではなく2.6.25
で作成するため、ブランチを指定する必要があります。
ブランチを指定する方法を探し回ると、sbtの公式で--branch
パラメータについて触れているページがありました。
sbt - Giter8 parameters
ターミナルで任意のディレクトリへ移動して以下のコマンドを実行します。
sbt new playframework/play-java-seed.g8 --branch 2.6.x
しばらくすると、ターミナル上で以下の項目を順番に聞かれます。
name [play-java-seed]:
organization [com.example]:
この2つは入力せずにそのままenterで飛ばして構いません。
処理終了まで待つと、ディレクトリ直下にplay-java-seed
の名前でディレクトリが作成され、その中にテンプレートプロジェクト一式がダウンロードされます。
任意のディレクトリにプロジェクトをダウンロードしたい時は
ここまでやるとこう思いませんか?
「このテンプレートプロジェクトを、別のプロジェクト名でダウンロードしたい」
そういう時は、--name=[プロジェクト名]
オプションを使うことで好きなプロジェクト名で作成できます。
このオプションに関しては、sbt new
コマンドが内部的に使用しているGiter8
のヘルプに書かれています。
Giter8 - 使用方法
以下のコマンドを実行すると、任意のディレクトリ直下にplay-sample
のプロジェクト名で2.6.x
のテンプレートプロジェクトをダウンロードできます。
sbt new playframework/play-java-seed.g8 --branch 2.6.x --name=play-sample
Gradleを使用したPlay Frameworkプロジェクトの起動
build.gradleの設定
無事にプロジェクトを作成できたら、プロジェクトをIDEで開いてみましょう。
今回はIDEに関しての話は省略しますが、Android以外のJava開発でよく使われるのはecipse
かIntelliJ IDEA
ですね。
プロジェクトを開いて確認すると、プロジェクトの直下にbuild.gradle
というファイルがあります。
このファイルは、Gradleでプロジェクトをビルドするための設定ファイルです。
ダウンロードしてきた時点ではGradle 5ベースの設定になっていますので、これをGradle Play Pluginに対応するために修正していきます。
設定変更の参考にするのは、Gradle Play Plugin公式の「1.3. Applying the plugin」、「3.1. Adding dependencies」、「4.1. Targeting a Play version」、「4.2. Configuring routes style」の4項目です。
1.3. Applying the plugin
Gradleに読み込むプラグインの設定です。
ダウンロードしてきた時点では、以下のような記述になっています。
plugins {
id 'play'
id 'idea'
}
id: 'play'
となっている項目が、Gradle 5まで使われていたプラグインを読み込む設定です。
これを以下のようにして、Gradle Play Pluginを読み込む形に変更します。
plugins {
// id 'play'
id 'org.gradle.playframework' version '0.9'
id 'idea'
}
3.1. Adding dependencies
プロジェクトのビルド時に使用する依存ライブラリの設定です。
ダウンロードしてきた時点では、以下のような設定になっています。
dependencies {
play dependencyFor("com.typesafe.play:play-guice", scalaVersion, playVersion)
play dependencyFor("com.typesafe.play:play-logback", scalaVersion, playVersion)
play dependencyFor("com.typesafe.play:filters-helpers", scalaVersion, playVersion)
}
GradleでのPlay対応が無くなり、Gradle Play Pluginに移行したことで依存ライブラリの設定方法が変更されています。
Gradle Play Plugin公式の解説を参考にして、2.6.25
に対応したライブラリを読み込むように変更します。
dependencies {
// play dependencyFor("com.typesafe.play:play-guice", scalaVersion, playVersion)
// play dependencyFor("com.typesafe.play:play-logback", scalaVersion, playVersion)
// play dependencyFor("com.typesafe.play:filters-helpers", scalaVersion, playVersion)
implementation "commons-lang:commons-lang:2.6"
implementation "com.typesafe.play:play-guice_2.12:2.6.25"
implementation "ch.qos.logback:logback-classic:1.2.3"
testImplementation "org.scalatestplus.play:scalatestplus-play_2.12:3.1.2"
}
今回は2.6.25
で動かすため、com.typesafe.play:play-guice
のライブラリバージョンを、Gradle Play Plugin公式で提示された2.6.15
ではなく、2.6.25
に変更しています。
4.1. Targeting a Play version
ビルド時にターゲットとするPlay Framework、Java, Scalaのバージョンの設定です。
ダウンロードしてきた時点では、以下のような設定になっています。
def playVersion = "2.6.22"
def scalaVersion = System.getProperty("scala.binary.version", /* default = */ "2.12")
...
model {
components {
play {
platform play: playVersion, scala: scalaVersion, java: '1.8'
injectedRoutesGenerator = true
sources {
twirlTemplates {
defaultImports = TwirlImports.JAVA
}
}
}
}
}
Gradle Play Pluginに移行したことでフォーマットが変更されているので、Gradle Play Plugin公式の記載に従って変更します。
また、今回は使用するPlay Frameworkのバージョンを2.6.25
としますので、playVersionの記述も変更します。
def playVersion = "2.6.25"
def scalaVersion = System.getProperty("scala.binary.version", /* default = */ "2.12")
...
play {
platform {
playVersion=playVersion
scalaVersion=scalaVersion
javaVersion=JavaVersion.VERSION_13
}
}
javaVersion
パラメータの設定は、ビルドに使用するJavaのバージョンに合わせて変更します。
2019/12時点ではbrew cask install java
の実行時にバージョンを指定しなければ、Java 13がインストールされます。
ですので、バージョンの情報をGradleで定義されたJavaVersion.VERSION_13
で指定します。
他のバージョンの定義情報についてはGradle公式リファレンスの以下ページに記載されています。
JavaVersion (Gradle API 6.0.1)
4.2. Configuring routes style
Play FrameworkでURLとControllerを関連付けるのに使用するroutesの形式をStaticRoutesGenerator
とするか、InjectedRoutesGenerator
とするかの設定です。
Play Frameworkの2.4
以降ではInjectedRoutesGenerator
がデフォルトの設定になりますので、以下のように設定を追加します。
play {
platform {
playVersion=playVersion
scalaVersion=scalaVersion
javaVersion=JavaVersion.VERSION_13
}
injectedRoutesGenerator = true
}
開発用サーバーで起動する
ターミナルに戻って、以下のコマンドを実行します。
gradle runPlay
ビルドに成功し、開発用サーバーが起動すると、以下のような表示になります。
BUILD SUCCESSFUL in 1s
7 actionable tasks: 1 executed, 6 up-to-date
Waiting for changes to input files of tasks... (ctrl-d to exit)
<=============> 100% EXECUTING [1m 49s]
> IDLE
この表示になったら、http://127.0.0.1:9000へブラウザでアクセスします。
こんな画面が表示されていれば、起動成功です。