あずきみるくのあずきはニガテ - for Engineer

ひよっこプログラマがやってみたことやハマっちゃったことなど、備忘録的な感じで書いていきます。

【Java】 WARファイルをHerokuにデプロイしたい

最近、Herokuを使い倒したいあずきです。

今回やりたいこと。


WARファイルをHerokuにデプロイしたい

以下の2点も追加でやってみたいと思います。

  • Gradleを使ってみる
  • プロジェクトの編集はeclipseで行う

この内容が不要な方は・・・下の方まで飛んでくださいw
※一番下の「続きを読む」をクリックしていただけると、
 下の手順から飛べます。

手順は以下の通りです。
eclipseは既に用意されているものとします。

1)Herokuアカウント取得
2)Gradleインストール
3)Gradleプロジェクトの作成
4)eclipseプロジェクトの作成
5)アプリケーションプログラムの作成
6)WARの作成
7)Herokuへのデプロイ
8)まとめ



ちなみに、本当はGitを使いたかったのです。
・・・いいところまで行ったとおもうのですが・・・
結果、できなかったので、なんとかWARファイルだけでも
動くようにしたい、という切実なアレです。

<環境>
  Windows 8.1 
  pleiades (eclipse 4.4 LUNA)
  Gradle 2.10



では、始めていきましょう!!




1)Herokuのアカウント作成

こちらからアカウントを作成してください。
たぶん、みたまんまできるので、割愛させてください(汗

2)Gradleインストール

Herokuにアプリを載せるためには、MavenもしくはGradleでビルド?された
プロジェクトである必要があります。

(ビルドツールを使っていないプロジェクトをUPしようとしたら
 怒られたでござる)

もしかしたら、そういったビルドツールを使わなくても
WARという形式であれば、デプロイすることができるかもしれませんが、
もともとGitを使いたかったため、Gradleを使ってビルドしています。

先生はこちらです。
先生はMacでやってるので、Gradleの使い方を教えてもらいます。
[備忘録!]GradleでWARを作る - Qiita

2-1.ダウンロード

ポップでかわいらしいこちらのページから、ダウンロードしてきます。
Download Gradle l Open Source Enterprise Build Automation

ダウンロードできたら解凍して、任意の場所に置いておきます。
(あずきはC直下に置きました)

2-2.インストール(パスの設定)

配置できたら、「bin」ディレクトリのパスを通します。
<パスの通し方>
windowsマークを右クリック」>「システム」>「システムの詳細設定」
>「環境変数」にて、「システム環境変数」の
「Path」に編集で追加します。

(既存の登録内容);C:\gradle-2.2.1\bin
※既存の内容とは「;(セミコロン)」で区切るので、必ずつけてください。

2-3.確認

コマンドプロンプトにて以下のコマンドを入力してみます。

gradle --version

以下の内容が表示されればOKです。

------------------------------------------------------------
Gradle 2.10
------------------------------------------------------------

Build time:   2015-12-21 21:15:04 UTC
Build number: none
Revision:     276bdcded730f53aa8c11b479986aafa58e124a6

Groovy:       2.4.4
Ant:          Apache Ant(TM) version 1.9.3 compiled on December 23 2013
JVM:          1.8.0_45 (Oracle Corporation 25.45-b02)
OS:           Windows 8.1 6.3 amd64

3)Gradleプロジェクトの作成

3-1.空フォルダの作成

任意の場所に空フォルダを作成します。
あずきは今後、eclipseで開発することを考えていたので、
以下の場所に「GradleSample」という名前で作成しました。

C:\pleiades\workspace\GradleSample

以下のコマンドの実行は全てプロジェクトのルートで行います。

3-2.Gradleプロジェクトとしての初期化

コマンドプロンプトで、以下のように記載します。

cd C:\pleiades\workspace\GradleSample
gradle init --type java-library

※「--type java-library」を使用することで、Java向けの構成を作ってくれるようです。

以下の通り表示されれば、OKです。

gradle init --type java-library
:wrapper
:init

BUILD SUCCESSFUL

Total time: 5.025 secs

3-3.確認

エクスプローラでフォルダの中身を確認します。
こんな感じでできています。
f:id:azuki-milk-lush:20160120133758p:plain

3-4.buile.gradleの編集

自動生成されたファイルの中で、特に重要なのは「build.gradle」です。
このファイルが設定ファイルみたいなもんです。

まず、自動生成されたbuild.gradleの中身を見てみましょう。
※不要と思われるコメントアウトは外しています。

// Javaを使いますよ、という設定
apply plugin: 'java'

/*
 依存関係のあるファイルをどこから落としてくるか、という設定。
 昔は「mavenCentral()」がメインだったようですが、
 今はデフォルトで作成されている通り、「jcenter」がおすすめのようです。
*/
repositories {
    jcenter()
}

// 依存関係のあるファイルを記述します
dependencies {
    compile 'org.slf4j:slf4j-api:1.7.13'
    testCompile 'junit:junit:4.12'
}


では、いよいよ「build.gradle」を編集していきます。
今回追加したい内容は以下の通り。

 ・eclipseで使えるようにしたい
 ・Servletを使えるようにしたい

では、追記します。


まずは、プラグイン
以下を追記します。
※コメント部分は省いた方がいいかも。

apply plugin: 'eclipse-wtp' //  wtp:WebToolPlatform
apply plugin: 'war'
/*
  'eclipse'というプラグインも存在します。WARファイルを作るとか、
 webに関する操作をしないのであれば、
   apply plugin: 'eclipse'
 のみを追加すればOK。
 ついでに、'eclipse-wtp'は、'eclipse'と同様の機能を内包しているので、
 重複して書く必要はありません。
*/

それから、依存関係のところにServletを追加。

dependencies {
    providedCompile 'javax.servlet:javax.servlet-api:3.1.0'
}

「providedCompile」とすることで、WARファイルを作成時に含まれないようになります。


全部を合わせると、こんな感じになります。

apply plugin: 'java'
apply plugin: 'eclipse-wtp'
apply plugin: 'war'

repositories {
    jcenter()
}

dependencies {
    compile 'org.slf4j:slf4j-api:1.7.13'
    testCompile 'junit:junit:4.12'
    providedCompile "javax.servlet:javax.servlet-api:3.1.0"
}

3-5.ビルド

ここまでできたら、いったんビルドします。
以下のコマンドを実行します。

gradle build

こんな感じで出力されます

C:\pleiades\workspace\GradleSample>gradle build
:compileJava
Download https://jcenter.bintray.com/org/slf4j/slf4j-api/1.7.13/slf4j-api-1.7.13
.pom
Download https://jcenter.bintray.com/org/slf4j/slf4j-parent/1.7.13/slf4j-parent-
1.7.13.pom
Download https://jcenter.bintray.com/javax/servlet/javax.servlet-api/3.1.0/javax
.servlet-api-3.1.0.pom
Download https://jcenter.bintray.com/org/slf4j/slf4j-api/1.7.13/slf4j-api-1.7.13
.jar
Download https://jcenter.bintray.com/javax/servlet/javax.servlet-api/3.1.0/javax
.servlet-api-3.1.0.jar
:processResources UP-TO-DATE
:classes
:war
:assemble
:compileTestJava
:processTestResources UP-TO-DATE
:testClasses
:test
:check
:build

BUILD SUCCESSFUL

Total time: 23.773 secs

4)eclipseプロジェクトの作成

4-1.準備

eclipseにプロジェクトとして認識させるために、
.project、.classpath、.settingといったファイルを作成します。

コマンドプロンプトにて、以下のコマンドを実行します。

gradle eclipse

すると、以下のように出力されます。

:eclipseClasspath
Download https://jcenter.bintray.com/org/slf4j/slf4j-api/1.7.13/slf4j-api-1.7.13
-sources.jar
Download https://jcenter.bintray.com/javax/servlet/javax.servlet-api/3.1.0/javax
.servlet-api-3.1.0-sources.jar
:eclipseJdt
:eclipseProject
:eclipseWtpComponent
:eclipseWtpFacet
:eclipseWtp
:eclipse

BUILD SUCCESSFUL

Total time: 11.718 secs


ここまでできたら、エクスプローラで作成されたプロジェクトを
見てみましょう。
こんな感じで、いろんなファイルが追加になっています。

f:id:azuki-milk-lush:20160120155029p:plain

4-2.eclipseへのインポート

eclipse用のプロジェクトが作成できたので、eclipseで編集できるように
インポートします。

プロジェクト・エクスプローラーなどで右クリック>
「インポート」>「既存プロジェクトをワークスペースへ」を選択

作成したプロジェクトを選択して、「完了」ボタンをポチします。

f:id:azuki-milk-lush:20160120155727p:plain

こんな感じでインポートされました!!
f:id:azuki-milk-lush:20160120160000p:plain

5)アプリケーションプログラムの作成

「アプリケーションプログラム」という言い方が正しいかは謎ですw
Herokuのアプリケーションと区別するためにこの言い方にしています。

では、eclipseで触れるようになったので、早速簡単なサーブレット
作成してみたいと思います。

Gradleの標準の構造として、通常のソースは「src/main/java」に、
テストコードは「src/test/java」に格納します。
よくある「WebContent」は「src/main/webapp」を作成します。


構成はこんな感じで青くしてる部分を作成します。
f:id:azuki-milk-lush:20160121132119p:plain

各ソースの中身はこんな感じで作成しています。

src/main/java/sample/SampleServlet.java

package sample;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class SampleServlet
 */
@WebServlet("/hello")
public class SampleServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public SampleServlet() {
        super();
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	PrintWriter out = response.getWriter();
	response.setContentType("text/html; charset=UTF-8");
	out.println("Hello World!");
    }

}

src/main/webapp/WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         id="WebApp_ID"
         version="3.1">
    <display-name></display-name>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>
</web-app>

src/main/webapp/index.html

<!DOCTYPE html>
  <html>
    <head>
      <meta charset="UTF-8">
      <title>GradleSample</title>
    </head>
    <body>
      Let's start GradleSample!
    </body>
  </html>

6)WARの作成

6-1.念のためのビルド

WARの作成に入る前に念のため、以下のコマンドでビルドしておきます。
(もしかしたらいらないかもしれないけど・・・)

gradle build

6-2.WARの作成

WARの作成は結構簡単です。
以下のコマンドを実行するだけ。

gradle --daemon war

「--daemon」をつけることで、バックグラウンドで実行してくれるそうな。

作成が完了したら、ここに「GradleSample.war」が作成されています。
C:\pleiades\workspace\GradleSample\build\libs

7)Herokuへのデプロイ

7-1.Heroku Toolbeltのインストール

基本的にHerokuの操作はコマンドプロンプトから
「heroku」コマンドを使用して実行します。

「heroku」コマンドを使用するために、
以下から「Heroku Toolbelt」をインストールする必要があります。
Getting Started with Java on Heroku | Heroku Dev Center

7-2.Herokuにログインする

「heroku」コマンドが使えるようになったら、
以下のコマンドを入力します。

heroku login

Herokuアカウントのメールアドレスを聞かれるので入力。
Enterするとパスワードを聞かれるので、入力します。

7-3.アプリケーションの作成

以下のコマンドを実行して、アプリケーションを配置する器的なものを作成します。

heroku apps:create [アプリケーション名]

※アプリケーション名は任意のものを設定することが可能ですが、
 全世界でユニークにする必要があります。
命名規則として、スネークケースじゃないとダメみたいです。
(aaa-aaa-aaaみたいな。AaaBbbみたいなのはキャメルケールといいます)

7-4.heroku-deployコマンドラインプラグインのインストール

WARをそのままデプロイする場合は「heroku deploy」コマンドを使用します。
そのコマンドを使用できるように、以下のコマンドを実行して
プラグインをインストールします。

heroku plugins:install https://github.com/heroku/heroku-deploy

このインストールは最初だけ行えばOKみたいです。

7-5.デプロイ

いよいよデプロイです。
以下のコマンドを実行します。

heroku deploy:war --war build/libs/GradleSample.war --app [アプリケーション名]

※WARファイルは
 「C:\pleiades\workspace\GradleSample\build\libs」配下にあり、
 プロジェクトのルートは「GradleSample」という前提です。

7-6.起動確認

実行結果のログは以下のコマンドで確認できます。

heroku logs --tail --app [アプリケーション名]

また、起動しているプロセスは以下のコマンドで確認できます。

heroku ps

7-7.画面表示

画面表示もコマンドでできます。

heroku open


こんな感じで画面開きました。
ルートなので「index.html」の内容ですね。
f:id:azuki-milk-lush:20160121131023p:plain

「/hello」をつけてもこんな感じ。
サーブレットで出力している内容です。
f:id:azuki-milk-lush:20160121131103p:plain

このように作成されたサーブレット通り、表示されることが確認できました。

8)まとめ

こんな感じで、割と簡単にできました。
悩んだ期間はあるのですが、できてしまえばなるほどー、って感じです。

ちなみに、Herokuのチュートリアルとか、スタートアップガイドは
個人的には充実してるのでは、と思いますが、いかんせん、すべて英語でした。
英語だとななめ読みしてしまうので、日本語版を切望してやみませんw

Herokuはいろいろ便利なのですが、HerokuToolbeltの機能は思ったより
シンプルなのかな?って印象です。
(デプロイ機能をプラグインでインストールしてるあたり)

まぁ、Gitでのデプロイがメインだと思われるので、そのためなのでしょう。きっと。

実はGitを使ったやり方を頑張ろうとしていて、2日ほど悩んだのですが
冒頭にも書いた通り、結局できませんでした。・・・無念orz
なので、ちょっぴり不完全燃焼・・・

でも、いつか、やりたい!!
GitもHerokuももっと勉強して、できるようになります!
そんで、できたらうれしそうにUPします!!


また、この内容でできなかった!とか、もっといいやり方あるよ!って方は
ぜひ教えていただきたいですm(_ _)m

よろしくお願いします☆



先生はこちら。
いつもお世話になっておりますm(_ _)m
HerokuにWARファイルをデプロイする - CLOVER