Spring BootをWindowsサービス化する方法

Spring Bootで作成したjarファイルをWindowsでサービスとして動作させる方法をご紹介します。

公式サイトの「Spring Boot アプリケーションのデプロイ 2.3. Microsoft Windows サービス」にも記載があり、リンクを辿っていくとやり方が分かるのですが、情報がまとまっていなく内容も簡易的で迷うところがあるため、この記事にまとめます。

ちなみにLinuxでサービス化する方法はこちらです。

Spring Boot で作成したアプリケーションを Linux でサービス化する
serviceファイル 作成 /etc/systemd/system/password-generator.service Desc...

jarファイルの準備

Spring Bootでjarファイルを作成します。普通に作成すればいいですが、実行可能jarとして作成しましょう。

実行可能jarの作り方はこちらです。

Spring Boot Fully Executable Jar の作り方
Spring Boot の Fully Executable Jar は、Javaコマンド 不要で実行できる Jarファイル です。 ...

winsw.exeダウンロード

winsw.exe を使います。ここに手順の記載があります。
GitHub – winsw/winsw: A wrapper executable that can run any executable as a Windows service, in a permissive license.

手順の記載中にダウンロードページがあります。ここです。

Releases · winsw/winsw (github.com)

この中の WinSW.NET4.exe をダウンロードします。

XMLファイルを作成

XMLファイルを作成します。これが起動時の設定になります。今回はこのXMLファイルをmyapp.xmlとします。

<service>
  <id>myapp</id>
  <name>My Application</name>
  <description>This service runs My Application system.</description>
  <executable>java</executable>
  <arguments>-jar "C:\\myapp.jar"</arguments>
</service>

nameがサービスの名前列に表示されます。descriptionがサービスの説明列に記載されます。

このコマンドで常駐サービスが作成できます。実際に実行する際には管理者権限でコマンドプロンプトを開き、WinSW.NET4.exeとXMLファイルは絶対パスで指定するといいでしょう。

> WinSW.NET4.exe install myapp.xml

失敗談

jarファイルの場所を間違えてXMLに記載していて、登録したサービスを起動したらポップアップでこうなりました。

---------------------------
サービス
---------------------------
ローカル コンピューター の myapp サービスを開始できません。
サービスはエラーを返しませんでした。Windows の内部エラーまたはサービスの内部エラーであった可能性があります。
問題が解決しない場合は、システム管理者に問い合わせてください。
---------------------------
OK 
---------------------------

なんでjarファイルの場所が違うと分かったのか、イベントビューアを確認すると、そのサービスが何のコマンドを実行したのか記載してある。なのでそれを見た。また、登録したサービス自体もファイルでログが出る。

サービスの登録に失敗したら、削除してまた登録すればいい。次のコマンドでサービスを削除。

sc delete "サービス名"

まとめ

Windows OS機能のタスクスケジューラでjarを実行するよう設定したことがあるのですが、なぜか起動されないことも多く、タスクスケジューラ機能を使っていくのは難しいようでした。

また、Tomcatをサービスとしてインストールして、そこにSpring Bootで作成したwarファイルをデプロイしてもいいのですが、お手軽さが損なわれるためjarファイルをサービス化するのがお勧めです。