かんがるーさんの日記

最近自分が興味をもったものを調べた時の手順等を書いています。今は Spring Boot をいじっています。

Spring Boot でログイン画面 + 一覧画面 + 登録画面の Webアプリケーションを作る ( その25 )( Windows で本番稼働させるためのディレクトリ作成、jar ファイル配置、bat ファイル作成、サービス登録、動作確認 )

概要

Spring Boot でログイン画面 + 一覧画面 + 登録画面の Webアプリケーションを作る ( その24 )( 登録画面のドロップダウンリストを設定ファイルから取得する方法の変更 ) の続きです。

  • 今回の手順で確認できるのは以下の内容です。
    • Windows で本番稼働させるためのディレクトリ作成、jar ファイル配置、bat ファイル作成、サービス登録、動作確認。
    • Spring Boot で作成した jar ファイルを Windows のサービスとして起動・停止する方法を記述します。

ソフトウェア一覧

  1. NSSM - the Non-Sucking Service Manager
    https://nssm.cc/usage

参考にしたサイト

  1. Java VM Options You Should Always Use in Production
    http://blog.sokolenko.me/2014/11/javavm-options-production.html

  2. Java8のHotSpotVMからPermanent領域が消えた理由とその影響
    http://equj65.net/tech/java8hotspot/

  3. TOYATAKU WEB 備忘録 - JVMオプション
    http://fomsan.sakura.ne.jp/memo/java/javaVMOptions.html

  4. 関口宏司のLuceneブログ - GC改善に役立つ新しいJVMパラメータ
    http://lucene.jugem.jp/?eid=431

  5. Apache TomcatからELBにアクセスする際に気をつけたい事 sun.net.inetaddr.ttl=-1
    http://dev.classmethod.jp/cloud/apache-tomcat-elb-ttl-1/

手順

Windows で本番稼働させるためのディレクトリ作成

実行環境は以下のディレクトリ構成にします。ファイルは後から配置する ( ログファイルは後から作成される ) ので、まずは全てのディレクトリを作成します。

C:\webapps\ksbysample-webapp-basic
├ bat
│ └ webapp_startup.bat
├ lib
│ └ ksbysample-webapp-basic-0.0.1-SNAPSHOT.jar
├ logs
│ ├ gc.log
│ └ ksbysample-webapp-basic.log
├ nssm
│ └ nssm.exe
└ work

bat ファイル作成

  1. IntelliJ IDEA 上で 1.0.x-productenv ブランチを作成します。

  2. ksbysample-webapp-basic の下に webapps/ksbysample-webapp-basic/bat ディレクトリを作成します。

  3. webapps/ksbysample-webapp-basic/bat の下に webapp_startup.bat を新規作成します。作成後、リンク先の内容 に変更します。

  4. 作成した webapp_startup.bat を C:\webapps\ksbysample-webapp-basic\bat の下に配置します。

jar ファイル作成、配置

  1. clean タスクを実行して以前作成していた jar ファイルを削除した後、build タスクを実行して jar ファイルを作成します。

  2. C:\project-springboot\ksbysample-webapp-basic\build\libs の下に ksbysample-webapp-basic-0.0.1-SNAPSHOT.jar が作成されますので、C:\webapps\ksbysample-webapp-basic\lib の下に配置します。

nssm のダウンロード、配置、サービス登録

  1. nssm の最新版をダウンロードします。https://nssm.cc/download のページ内の「Latest release」の「nssm 2.24」リンクをクリックして nssm-2.24.zip をダウンロードします。

  2. nssm-2.24.zip を解凍します。解凍して作成された nssm-2.24\win64 ( 32bit環境の場合には nssm-2.24\win32 ) ディレクトリの下にある nssm.exe を C:\webapps\ksbysample-webapp-basic\nssm の下に配置します。

  3. コマンドプロンプトを「管理者として実行...」モードで起動します。

  4. 以下のコマンドを実行します。

    > cd /d C:\webapps\ksbysample-webapp-basic\nssm
    > nssm.exe install ksbysample-webapp-basic

    ※nssm.exe のオプション一覧はコマンドプロンプトで "nssm.exe" を何もオプションを付けずに実行すれば表示されます。

  5. 「NSSM service installer」画面が表示されます。以下の画像の値を入力した後、「Install service」ボタンをクリックします。サービスの登録に成功すると「Service "ksbysample-webapp-basic" installed successfully!」のダイアログが表示されますので「OK」ボタンをクリックします。

    f:id:ksby:20150331004036p:plain

    • 「Path」に C:\webapps\ksbysample-webapp-basic\bat\webapp_startup.bat を入力します。
    • 「Startup directory」に C:\webapps\ksbysample-webapp-basic\bat を入力します。

動作確認

  1. サービス画面を開きます。サービス一覧から「ksbysample-webapp-basic」を選択し、「サービスの開始」リンクをクリックしてサービスを開始します。

    f:id:ksby:20150331012059p:plain f:id:ksby:20150331012214p:plain

  2. C:\webapps\ksbysample-webapp-basic\logs の下の ksbysample-webapp-basic.log をエディタで開き、最後に "Started Application in ..." のログが出力されていることを確認します。

  3. ブラウザから http://localhost:8080/ にアクセスし、ログイン画面が表示されること、ログイン画面からログインして検索/一覧画面が表示されることを確認しようとしたのですが、ログイン直後に ksbysample-webapp-basic.log に「Caused by: java.io.IOException: 確立された接続がホスト コンピューターのソウトウェアによって中止されました。」のログが出力されることに気づきました。原因を調査します。

  4. 最初 Web で調べても原因がよく分からなかったのですが、よく考えたら Spring Boot でログイン画面 + 一覧画面 + 登録画面の Webアプリケーションを作る ( 番外編 )( 静的リソースを配置する static ディレクトリはどこに作るべきか? ) で書きましたが、CSS/JS ファイルを格納している static ディレクトリを /src/main/resources/static ではなく /static に配置していたため、jar ファイルに格納されていなかったためでした。「Caused by: java.io.IOException: 確立された接続がホスト コンピューターのソウトウェアによって中止されました。」のログってリクエスト先がない時に出るものなのですね。もう少し分かりやすいエラーメッセージにして欲しかったです。。。

  5. サービス画面で「ksbysample-webapp-basic」サービスを停止します。

  6. /static ディレクトリを /src/main/resources/static へ移動します。Project View で /static ディレクトリを選択後、コンテキストメニューを表示して「Refactor」-「Move...」メニューを選択します。

    f:id:ksby:20150331014508p:plain

  7. 「Move」ダイアログが表示されます。「To directory」に以下の画像のパスを入力して「OK」ボタンをクリックします。

    f:id:ksby:20150331014708p:plain

  8. static ディレクトリが /src/main/resources/static の位置に移動します。

    f:id:ksby:20150331015233p:plain

  9. clean タスク → build タスクを実行して jar ファイルを作成し直した後、C:\webapps\ksbysample-webapp-basic\lib の下へコピーします。

  10. サービス画面で「ksbysample-webapp-basic」サービスを起動します。

  11. ブラウザから http://localhost:8080/ にアクセスし、ログイン画面が表示されること、ログイン画面からログインして検索/一覧画面が表示されることを確認します。今度は動作上も問題なく、ksbysample-webapp-basic.log にもエラーは出力されませんでした。

サービス削除

  1. サービス画面で「ksbysample-webapp-basic」サービスを停止します。

  2. サービスを削除します。管理者モードで起動しているコマンドプロンプトから以下のコマンドを実行します。

    > nssm.exe remove ksbysample-webapp-basic

  3. 「Remove the service?」のダイアログが表示されますので、「はい」ボタンをクリックします。サービスが削除されると「Service "ksbysample-webapp-basic" removed successfully!」のダイアログが表示されますので「OK」ボタンをクリックします。

commit、GitHub へ Push、1.0.x-productenv -> 1.0.x へ Pull Request、1.0.x でマージ、1.0.x-productenv ブランチを削除

  1. commit、GitHub へ Push、1.0.x-productenv -> 1.0.x へ Pull Request、1.0.x でマージ、1.0.x-productenv ブランチを削除、をします。

次回は。。。

最後に目次を作成してここまでの感想を書いて締めようと思いましたが、タイミングよく Spring Boot 1.2.3 がリリースされたようなので、バージョンアップします。

ソースコード

webapp_startup.bat

@echo on

setlocal
set JAVA_HOME=C:\Java\jdk1.8.0_25
set PATH=%JAVA_HOME%\bin;%PATH%
set WEBAPP_HOME=C:\webapps\ksbysample-webapp-basic
set WEBAPP_JAR=ksbysample-webapp-basic-0.0.1-SNAPSHOT.jar

cd /d %WEBAPP_HOME%
java -server ^
     -Xms1024m -Xmx1024m ^
     -XX:MaxMetaspaceSize=384m ^
     -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled ^
     -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=75 ^
     -XX:+ScavengeBeforeFullGC -XX:+CMSScavengeBeforeRemark ^
     -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps ^
     -Xloggc:%WEBAPP_HOME%/logs/gc.log ^
     -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=10M ^
     -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=%WEBAPP_HOME%/logs/`date`.hprof ^
     -XX:ErrorFile=%WEBAPP_HOME%/logs/hs_err_pid_%p.log ^
     -Dsun.net.inetaddr.ttl=100 ^
     -Dspring.profiles.active=product ^
     -jar lib\%WEBAPP_JAR%
  • jvm のオプションは参考サイトを見ながらとりあえず書いてみただけのものです。

履歴

2015/04/01
初版発行。