mike-neckのブログ

Java or Groovy or Swift or Golang

Gradleでherokuアプリケーションを作成する

こんにちわ、みけです。

なんかgithubでブログやってたのですが、

なんかoctopressが調子悪くて、はてなで書くことにしました。

それ以前に僕が調子悪いですけど…

Gradleでherokuにアプリケーションをデプロイする

Gradle herokuで検索をするとGradleで作ったアプリケーションを

herokuにデプロイする方法が出てきます。

ただ、まあ、なんというか、みんなJetty embbededを使ってstatic void mainから

始まるアプリケーションが多かったので、

オーソドックスなservletアプリケーションをjetty-runnerで走らせる方法を

簡潔にまとめました。

もう既にJava好きな皆さんにとっては、なんというかもう常識的なことなので、

ここに書いてあることは当たり前なのかもしれませんが…

以下、必要なファイル毎に書いていきます。

  • build.gradle
  • Procfile
  • system.properties




build.gradle

Herokuでjetty-runnerでwebアプリを動かす場合に注意する点は次のとおりです

gradle wrapperを実行しておく

実行するgradleのバージョンを一致させるために

gradle wrapperを実行しておきます。

$ gradle wrapper

これで、プロジェクトのディレクトリーにgradlewが作成されていることを確認しておきます。


jettyプラグインを使う

これは別にwarプラグインでも構いませんが、

ローカルで動かしてテストしたいだろうと思いますので、

jettyプラグインを使います。

apply plugin : 'jetty'


providedCompile configurationでjetty-runnerを指定する

jetty-runnerでHerokuアプリを走らせますので、

providedCompile configurationでjetty-runnerを指定しておきます。

repositories {
    mavenCentral()
}
dependencies {
    compile 'javax.servlet:javax.servlet-api:3.1.0'
    providedCompile ('org.eclipse.jetty:jetty-runner:9.2.0.v20140526') {
        exclude module : 'javax.servlet-api'
    }
    testCompile 'junit:junit:4.11'
}

また、jetty-runnerをディレクトリー指定してダウンロードさせるために、

Copyタイプのタスクを作成します。

task copyJetty (type : Copy) {
    into "$buildDir/jetty"
    from configurations.providedCompile
}


stageタスクを用意する

HerokuでのGradleアプリケーションはstageタスクにてアプリケーションのビルドをします。

そのため、stageタスクに実行させておきたいタスクを記述しておきます。

task stage (dependsOn : ['clean', 'copyJetty'])
stage.finalizedBy build

上記で作成したcopyJettyタスクは何故かファイルを上書きしてしまったので、

task finalizationで最終的にbuildタスクを実行させます。

(Copyで上書きしない方法があったはずだけど、長年のブランクで忘れた)

これらをまとめたbuild.gradleは次のとおり

apply plugin : 'jetty'
repositories {
    mavenCentral()
}
dependencies {
    compile 'javax.servlet:javax.servlet-api:3.1.0'
    providedCompile ('org.eclipse.jetty:jetty-runner:9.2.0.v20140526') {
        exclude module : 'javax.servlet-api'
    }
    testCompile 'junit:junit:4.11'
}
task copyJetty (type : Copy) {
    into "$buildDir/jetty"
    from configurations.providedCompile
}
task stage (dependsOn : ['clean', 'copyJetty'])
stage.finalizedBy build




Procfile

Procfileにはアプリケーション実行のコマンドを記述しておきます。

(あまりよくわかってない…)

最初、僕はこのファイルでgradleのjettyRunWar

実行させようとしていたのですが、見事にコケました。

web: java $JAVA_OPTS -jar build/jetty/jetty-runner-9.2.0.v20140526.jar --port $PORT build/libs/*.war

またherokuのgradlewで作成されるwarファイルも、

なんかランダムな文字列になっているので、

warファイル指定にワイルドカードを使っています。




system.properties

ここにはJavaのバージョンを指定します。

僕はJava8を使いたかったのでjava8を指定します。

java.runtime.version=1.8




herokuへのアプリケーションのデプロイ

herokuへのデプロイは皆さんが御存知の通りで、

僕が説明するまでのことはないでしょう。

  • toolbeltをインストールする
  • herokuアカウントを作成する
  • herokuにssh-keyを登録する
  • heroku側にアプリケーションを作成する
  • herokuにpushする

heroku側にアプリケーションを作成するために、次のコマンドを打ちます

$ heroku create

herokuにpushするために次のコマンドを打ちます

$ git push heroku master

これでアプリケーションのデプロイが完了します。