なにか作る

なにかを作るブログです。

Gradleを使ったSpring BootアプリケーションをHerokuにデプロイするには

「はじめての Spring Boot」を読んでいる

最近「はじめての Spring Boot」を読みつつ、Spring Boot アプリケーションを作っている。

本の後半で、作成した Sprin Boot のアプリケーションを Heroku にデプロイする手順があるのだが、この本ではアプリケーションのビルドに Maven を使っていて、Heroku のデプロイ手順も Maven を使っていることを前提に書かれている。個人的な好みから Maven ではなくGradle を使っていたため、デプロイで少しハマった。終わってみれば大したことはないのだが、一応メモしておく。

Gradleを使った場合の注意点

公式サイトに Gradle を使ったアプリケーションを Heroku にデプロイする方法が記載されているので、基本はそれに従う。 devcenter.heroku.com

1. Gradle Wrapper を使う

必ずしも使う必要は無いのかもしれないけれど、使っておいた方がよさげ。

build.gradle

task wrapper(type: Wrapper) { gradleVersion = '2.7' }

Heroku デプロイ時に自動的に gradlew の方を使ってくれる。

2. stage タスクを作成する

Gradle Wrapper のファイルがあると、Heroku は自動的に Gradle を使用していることを検知し、stage タスクを実行する。

build.gradle

task stage {
  dependsOn assemble
}

ここでは assemble タスクを指定しておけば十分だろう。

3. Procfile を書く

Gradle が JAR ファイルを出力する先は Maven と違うので、正しい場所を指定してあげる。

Procfile

web: java -jar build/libs/*.jar --server.port=$PORT

これで OK。

Windows で heroku local するときの注意点

ちなみにheroku local webで、ローカルでデプロイを試すことができるのだが、Windows では Procfile の書き方に注意する必要がある。*nix ベースを前提とした Procfile の内容をそのままコマンドプロンプト上で実行してしまうからだ。例えば上のファイルの内容で実行しようとすると、以下のようなエラーになる。

web.1 | Error: Unable to access jarfile build/libs/*.jar

Windows で動作させるためにはコマンドプロンプト流に書いてあげる必要がある。例えば以下のような具合に。

Procfile

web: java -jar build/libs/test-0.0.1-SNAPSHOT.jar --server.port=%PORT%

*.jar 的な指定方法を Windows でどうすれば実現できるのかはわからなかった…。