JavaアプリからWindowsサービスを作成する方法


220

XPとVistaにサービスとしてインストールする必要があるJavaアプリケーションを継承しました。私が何らかの形でウィンドウを使用してから、サービスを作成する必要がなくなってから8年になります。Javaアプリのようなものからは言うまでもありません(アプリ用のjarと単一の依存性jarを持っています-log4j )。これをサービスとして実行するために必要な魔法は何ですか?私はソースを持っているので、コードの変更は、できれば避けられますが、可能です。



1
完全を期すために、ここでserverfault.com/a/259195は、アプリがService Control Managerコールバックに応答する必要があることを示しています。このチュートリアルを読んで、それはProcrunの使用ticklingmind.blogspot.com/2010/03/...を
Broken_Window

回答:


69

11
Java Service Wrapperはとても便利に見えます。でも機能一覧を見てみました。コミュニティバージョンはサーバーでの使用が許可されていないことに注意する必要があります。
ブライアンマシューズ

それは問題になる可能性があります。数年前に使ってみました。彼らが充電することに決めたと思います。
だらしない2008

このラッパーは多くのオープンソースプロジェクトで使用されており、ActiveMQなどのいくつかのJakarta Apacheに含まれています。
トッド:

7
wrapper.tanukisoftware.org/doc/english/licenseCommunity.html クローズドソースの使用GPLは、GPLの完全なソースを作成せずにソフトウェアが配布されない限り、GPLの下でソフトウェアに依存する内部使用のために開発されるプライベートソフトウェアを制限しません。すべてのユーザーが利用できるアプリケーション全体。企業および政府のユーザーはサーバーまたは開発ライセンス契約を使用することをお勧めしますが、コミュニティライセンス契約は、アプリケーションが内部で使用されるか、常に完全なsrcと共に配布される限り、受け入れられます。
ウラジミール

1
@Vladimir tanukiラッパーは64ビットアーチのオープンソースではなくなりました
gerrytan 2014

100

Apache Commons Daemonは良い代替手段です。それはしていProcrun Windowsサービスのために、とJSVC UNIXデーモンのため。制限の少ないApacheライセンスを使用しており、Apache TomcatはそれをWindowsおよびLinux上で実行するためにそれ自体の一部として使用します!機能させるには少し注意が必要ですが、実際に機能する例を網羅した記事があります。

それ以外に、Apache Tomcatの bin \ service.batを見て、サービスの設定方法を知ることもできます。Tomcatでは、Procrunバイナリの名前を変更します(prunsrv.exe-> tomcat6.exe、prunmgr.exe-> tomcat6w.exe)。

Procrunの使用で苦労したこと、startメソッドとstopメソッドはパラメーター(String [] argv)を受け入れる必要があります。たとえば、「start(String [] argv)」と「stop(String [] argv)」は機能しますが、「start()」と「stop()」はエラーを引き起こします。これらの呼び出しを変更できない場合は、それらの呼び出しをニーズに合わせてマッサージできるブートストラップクラスを作成することを検討してください。


リフレクションを使用すると、前の段落で述べた問題を回避できるでしょう。また、Apache Commonsデーモンは、私が知っている唯一のラッパーで、64ビットのビルド済みバイナリが無料で使用できるようになっています。
djangofan

各JVMオプションの間にキャリッジリターンが必要です。たとえば、同じ行に-Dopt1 = a -Dopt2 = bがある場合、機能しない可能性があります。それを修正するには、あなたが書く必要があります--JvmOptions=-Dopt=a#-Dopt2=b。私はantスクリプトからコマンドを実行していて、そのため何日も苦労していました。それが役に立てば幸い。
シドニー

あなたが話していた記事はもう存在しません...それに到達する方法はまだありますか?Apache Commons Daemonで必要なことを実行できません。
11101101b

3
@ 11101101b、Apacheは記事の根拠を独自のWikiページに添付しているようです...
Lucas

@community wiki、私は64ビットWindowsマシンにApache Commons Daemonを使用しましたが、サービスを正常に追加しました。32ビットのWindows 7マシンで同じプロセスを使用していますが、サービスを追加できません。
Shakthi、2014

59

Apache Commonsのデーモンあなたは今、カスタム実行可能ファイル名とアイコンを持つことができます! 独自の名前とアイコンが付いたカスタムWindowsトレイモニターを入手することもできます。

これで、自分のサービスを自分の名前とアイコン(prunsrv.exe)で実行できます。システムトレイモニター(prunmgr.exe)にも独自のカスタム名とアイコンがあります。

  1. Apache Commons Daemonバイナリをダウンロードします(prunsrv.exeとprunmgr.exeが必要です)。
  2. それらの名前MyServiceName.exeMyServiceNamew.exeそれぞれとに変更します。
  3. WinRun4JをダウンロードしRCEDIT.exe、付属のプログラムを使用して、次のように独自のカスタムアイコンを埋め込むようにApache実行可能ファイルを変更します。

    > RCEDIT.exe /I MyServiceName.exe customIcon.ico
    > RCEDIT.exe /I MyServiceNamew.exe customTrayIcon.ico
  4. 次のようにWindowsサービスをインストールします(詳細とオプションについては、ドキュメントを参照してください)。

    > MyServiceName.exe //IS//MyServiceName \
      --Install="C:\path-to\MyServiceName.exe" \
      --Jvm=auto --Startup=auto --StartMode=jvm \
      --Classpath="C:\path-to\MyJarWithClassWithMainMethod.jar" \
      --StartClass=com.mydomain.MyClassWithMainMethod
  5. これで、独自のアイコンと名前で実行されるJarのWindowsサービスができました。モニターファイルを起動して、独自のアイコンと名前でシステムトレイで実行することもできます。


1
私はあなたのハウツーに従ってすべてを行いましたが、それはsystrayアイコンを変更しません。
outofBounds

申し訳ありませんが、@ outofBoundsさん、コメントを今まで見ていませんでした。RCEDIT.exeプログラムは、サービス実行可能ファイルのアイコンを変更するものです。各サイズが正しく定義された有効な.icoファイルがあることを確認してください。:あなたは、ここで適切な.icoファイルを作成する方法を見ることができますstackoverflow.com/questions/4354617/...
11101101b

2
ご存知のように、サービス名にスペースを含めることはできません。
11101101b 2013年

1
はい@Shakthiそれは32ビットおよび64ビットのWindows XP、7、8、8.1、Server 2003では、2008年、そして2012年に罰金を動作します
11101101b

1
はい、@ Syamsoul Azrein、それは10およびすべてのサーバーエディションで優れた動作をします。
11101101b

31

簡単な方法は、NSSMラッパーラッパーです(私のブログエントリを参照)。


7
NSSM ROCKS!私のJavaプログラムからでもラッパーを簡単に作成できます。簡単、軽量、動作-100kbの幸せ!ありがとうございました!
cynepnaxa 2014年

1
例として、システム起動時にバックグラウンドでNSSMラッパーを使用してJavaアプリ(HelioSearchを使用している)インスタンスをWindowsサービスとして起動する方法を教えてください。
Krunal、2015年

@GiordanoMaestroブログエントリにアクセスできなくなりました。別のリンクがありますか?
Matthieu

2
Apache Commons Daemon、wrapper.tanukisoftware.org、およびyajswと比較すると、NSSMは、単純なJavaアプリをWindowsサービスに変えるための最も速くて簡単なオプションでした
Jeffrey Knight

NSSMを使用してSpring Boot実行可能jarを実行しようとしています。「STARTコントロールに応答して予期しないステータスSERVICE_PAUSEDが発生しました」というエラーが発生しました。
キランクマール2016

26

もう1つのオプションはWinRun4Jです。これは、Windowsサービスホスト(32ビットバージョンと64ビットバージョンの両方)を兼ねる構成可能なJavaランチャーです。これはオープンソースであり、その使用に関する制限はありません。

(完全な開示:私はこのプロジェクトに取り組んでいます)。


3
これをありがとう。私はYAJWSを試してみましたが、最初は19MBのダウンロードで私を怖がらせました、そして私が指示に従った後、それは「エラー解析コマンドライン」を示しました。私はPROCRUNを見てきましたが、簡単な設定には面倒すぎます。INSTSRV / SRVANYにはレジストリの変更が必要です!Launch4JはJARをEXE内にパックするため、デプロイメントが複雑になります。WinRun4Jはぴったりでした。唯一の欠点は、(標準のメインクラスを単に呼び出すのではなく)サービスとして機能するために特別なクラスが必要になることです。しかし、全体としては99%完璧です。
fernacolo、

2
参考までに、最新バージョンには標準のメインクラスのラッパーがあります。
ピーター・スミス

こんにちは、これを使用する方法を説明する例を挙げていただけますか?システムの起動時に、これを使用してHelioSearchインスタンスをバックグラウンドのWindowsサービスとして開始したいと思います。
Krunal

17

さらに別の答えは、Yet Another Java Service Wrapperです。これは、ライセンスが優れているため、Java Service Wrapperの優れた代替手段のようです。また、JSWからYAJSWへの移行を容易にすることも目的としています。確かに、私にとっては、Windowsサーバーの新製品であり、Javaアプリをサービスとして実行しようとすることは、非常に簡単でした。

私が見つけたが、最終的には使用しなかった他のいくつか:

  • Java Service Launcher YAJSWよりも動作が複雑に見えたため、使用しませんでした。これはラッパーではないと思います。
  • JSmooth作成ウィンドウのサービスはその主な目的ではありませんが、実行できます。2007年以来活動がなかったため、これを使用しませんでした。

私からの+1は、「箱から出しただけ」で私にとって最も迅速な解決策であり、Javaアプリの修正は必要ありません。これは間違いなくプラスです。
Green Day、

YAJSWを他のいくつかの一般的なサービスラッパーと比較したこの非常に説得力のある比較表を見つけました。 yajsw.sourceforge.net/#mozTocId284533
グリーン

6

Java Service Wrapperはうまく機能すると思います。アプリケーションを統合するには3つの方法があることに注意してください。コードを変更したくない場合、オプション1が最適です。構成ファイルは少しおかしくなりますが、(オプション1の場合)開始しているプログラムが引数を指定するのは、プログラムを開始するヘルパープログラムであることを覚えておいてください。彼らは持っているサンプル設定ファイルこのために。


5

Gradleビルドツールを使用している場合は、Apache Commons Daemon Procrunの使用を容易にするmy -windows-service-pluginを試すことができます。

プラグインを使用してJava Windowsサービスアプリケーションを作成するには、いくつかの簡単な手順を実行する必要があります。

  1. 適切なメソッドでメインサービスクラスを作成します。

    public class MyService {
    
        public static void main(String[] args) {
            String command = "start";
            if (args.length > 0) {
                command = args[0];
            }
            if ("start".equals(command)) {
                // process service start function
            } else {
                // process service stop function
            }
        }
    
    }
  2. プラグインをbuild.gradleファイルに含めます。

    buildscript {
      repositories {
        maven {
          url "https://plugins.gradle.org/m2/"
        }
      }
      dependencies {
        classpath "gradle.plugin.com.github.alexeylisyutenko:windows-service-plugin:1.1.0"
      }
    }
    
    apply plugin: "com.github.alexeylisyutenko.windows-service-plugin"

    Gradle 2.1で導入された新しいインキュベーティングプラグインメカニズムの同じスクリプトスニペット:

    plugins {
      id "com.github.alexeylisyutenko.windows-service-plugin" version "1.1.0"
    }
  3. プラグインを設定します。

    windowsService {
      architecture = 'amd64'
      displayName = 'TestService'
      description = 'Service generated with using gradle plugin'   
      startClass = 'MyService'
      startMethod = 'main'
      startParams = 'start'
      stopClass = 'MyService'
      stopMethod = 'main'
      stopParams = 'stop'
      startup = 'auto'
    }
  4. ファイル名を指定して実行createWindowsService Windowsサービスの分布を作成するために、Gradleのタスク。

シンプルなWindowsサービスを作成するために必要なことは、これだけです。プラグインは、Apache Commons Daemon Procrunバイナリを自動的にダウンロードし、このバイナリをサービス配布ディレクトリに抽出して、サービスのインストール/アンインストール用のバッチファイルを作成します。

では${project.buildDir}/windows-serviceディレクトリあなたは、サービスのインストール/アンインストールし、すべてのランタイムライブラリのためのバッチスクリプトをサービス実行可能ファイルを見つけます。サービス実行をインストールする<project-name>-install.bat場合、およびサービス実行をアンインストールする場合<project-name>-uninstall.bat。サービスを開始および停止するには、<project-name>w.exeexecutableを使用します。

サービスの開始を処理するメソッドは、処理を実行するために別のスレッドを作成して開始し、その後に戻る必要があることに注意してください。mainメソッドは、サービスを開始および停止するときに異なるスレッドから呼び出されます。

詳細については、プラグインとApache Commons Daemon Procrunについてお読みください。


過小評価された答え!
TaylanUB 2018


4

Java 8では、外部ツールなしでこのシナリオを処理できます。java 8に付属するjavapackagerツールは、自己完結型アプリケーションバンドルを作成するオプションを提供します。

-native type自己完結型のアプリケーションバンドルを生成します(可能な場合)。-Bオプションを使用して、使用するバンドラーに引数を提供します。タイプが指定されている場合、このタイプのバンドルのみが作成されます。タイプが指定されていない場合は、すべてが使用されます。

タイプには次の値が有効です。

-native type
Generate self-contained application bundles (if possible). Use the -B option to provide arguments to the bundlers being used. If type is specified, then only a bundle of this type is created. If no type is specified, all is used.

The following values are valid for type:

all: Runs all of the installers for the platform on which it is running, and creates a disk image for the application. This value is used if type is not specified.
installer: Runs all of the installers for the platform on which it is running.
image: Creates a disk image for the application. On OS X, the image is the .app file. On Linux, the image is the directory that gets installed.
dmg: Generates a DMG file for OS X.
pkg: Generates a .pkg package for OS X.
mac.appStore: Generates a package for the Mac App Store.
rpm: Generates an RPM package for Linux.
deb: Generates a Debian package for Linux.

Windowsの場合は、次のドキュメントを参照して、必要に応じてmsiまたはexeを作成できます。

exe: Generates a Windows .exe package.
msi: Generates a Windows Installer package.

4
この回答は質問には対応していません。javapackagerを使用してWindowsサービスを直接作成することはできませんが、jreやその他のリソースを含む自己完結型の実行可能ファイルを作成できます。
tobias_ 2017年


3

ショートカットを入れる必要があるので簡単です

Windows 7 C:\users\All Users\Start Menu\Programs\Startup(管理者)またはUser home directory(%userProfile%)

Windows 10: 実行中 shell:startup

そのプロパティで->ショートカット->ターゲット-> java.exe -jar D:\..\runJar.jar

注:これはログイン後にのみ実行されます


管理者権限あり

sc create serviceName binpath= "java.exe -jar D:\..\runJar.jar" Windowsサービスを作成します

あなたが取得する場合、タイムアウトを使用するcmd /c D:\JAVA7~1\jdk1.7.0_51\bin\java.exe -jar d:\jenkins\jenkins.warが、でもこれであなたはタイムアウトを取得しますが、バックグラウンドのjava.exeに開始されます。タスクマネージャにチェックインする

注:これは、Windowsログオンの起動時に実行されます(サインイン前、サービス ' Startup Type'に基づいて)

Windowsサービスの作成の詳細な説明


3

Glassfish v3用に作成された「winsw」を使用してください。ただし、一般的にJavaプログラムでうまく機能します。

.NETランタイムのインストールが必要です。


一方、現在のバージョン(有名な河口浩介氏が管理)はここにあります
FrVaBe 2013

バージョン1.9以降にgithubに移動したようです(おそらくOracleからCloudbeesに移行したとき)。
–ThorbjørnRavn Andersen 2013

2

以前にJavaServiceを使用したことがあり、成功しています。2、3年は更新されていませんが、使用してみるとかなり堅実でした。


GForgeは廃止されました
lww

2

Java Service Wrapperのライセンスが気に入らなかった。ActiveState Perlを使用して、この作業を行うサービスを作成しました。

C#でサービスを作成することを考えましたが、時間の制約が厳しすぎました。


「perl」で行ったハックのサンプルを提供できますか?
peaceUser 2016年

2

私は常にsc.exeを使用しています(http://support.microsoft.com/kb/251192を参照)。SP1からXPにインストールする必要があります。Vistaの趣味に合わない場合は、Vistaリソースキットでダウンロードしてロードできます。

私はJavaであまり複雑なことはしていませんが、完全修飾されたコマンドライン引数(x:\ java.exe ....)を使用するか、依存関係を含めてパラメーターを設定するためにAntでスクリプトを作成することでうまくいきます。


1
これで何かをサービスとして開始できますが、私の理解ではそれは切り離されます。つまり、サービスを介してそれを停止したり、自動的に再起動したりできませんでした。しかし、私は完全に間違っている可能性があります-これを調べ始めただけです。
10

1

別の良いオプションはFireDaemonです。NASA、IBMなどのいくつかの大きな店で使用されています。完全なリストについては、Webサイトを参照してください。


1

私は現在、Eclipseベースのアプリケーションを実行するためにこれを必要としていますが、そのアプリケーションに対してローカルな変数を最初に設定する必要があります。sc.exeは実行可能ファイルのみを許可し、スクリプトは許可しないため、Windows 2003リソースキットの一部であるautoexnt.exeを使用しました。サービスを単一のバッチファイルに制限しますが、サービスに変換する必要があるのは1つのバッチスクリプトだけです。

チャオ!


-1

Exe4jは無料ではありませんが、非常に優れたオプションです。Exe4jで確認してください。.exeファイルを作成するウィザードでは、サービスを作成するオプションがあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.