web-dev-qa-db-ja.com

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

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

207
ideasculptor

運が良かった Java Service Wrapper

66
sblundy

Apache Commons Daemon が良い選択肢です。 Windowsサービスの場合は Procrun 、UNIXデーモンの場合は Jsvc です。それはより制限の少ない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()"はエラーになります。これらの呼び出しを変更できない場合は、それらの呼び出しを自分のニーズに合うようにマッサージできるブートストラップクラスを作成することを検討してください。

94
mcdon

Apache Commons Daemon を使うと、カスタムの実行可能ファイル名とアイコンを持てるようになりました!カスタムの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サービスをこのようにインストールしてください(詳細とオプションについては documentation を参照してください):

    > 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サービスを持っています!モニタファイルを起動することもでき、それはあなた自身のアイコンと名前でシステムトレイで実行されます。

53
11101101b

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

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

25
Peter Smith

簡単な方法は NSSM Wrapper Wrapperです( 私のブログ記事を見てください )。

25

さらに別の答えは まだ別のJava Service Wrapper ですが、これはJava Service Wrapperに代わる優れたライセンスであると思われます。また、JSWからYAJSWに簡単に移動できるようにすることも目的としています。確かに私にとっては、Windowsサーバーの新機能で、サービスとしてJavaアプリケーションを実行しようとするのは非常に簡単でした。

私が見つけた他の人もいましたが、最終的には使いませんでした。

  • Java Service Launcher YAJSWよりも作業が複雑に見えたため、これを使用しませんでした。これはラッパーだとは思わない。
  • JSmooth Windowのサービスを作成することは主な目的ではありませんが、 できます 。 2007年以来活動がなかったので、私はこれを使いませんでした。
17
atomicules

私は Java Service Wrapper がうまくいっていると思います。アプリケーションを統合するには つの方法 があります。コードを変更したくないというのであれば、オプション1が一番うまくいくように思えます。設定ファイルはちょっとおかしくなるかもしれません、しかし(オプション1のために)あなたが始めてそして引数を指定することになるプログラムはそれからあなたのプログラムを開始するそれらのヘルパープログラムであることをただ覚えていてください。これには 設定ファイルの例 があります。

6
Ed Thomas

JavaService はLGPLです。とても簡単で安定しています。強くお勧めします。

4
NT_

Gradle Build Toolを使用しているなら、my windows-service-plugin を試すとよいでしょう。これは Apache Commons Daemon Procrun の使用を容易にします。

プラグインを使って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サービス配布を作成します。

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

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

メソッド処理サービスの開始では、処理を実行するために別のスレッドを作成して開始してから戻る必要があります。 mainメソッドは、サービスを起動および停止するときにさまざまなスレッドから呼び出されます。

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

4

Glassfish v3用に書かれた " winsw "を使用してくださいが、一般的にはJavaプログラムでうまく動作します。

.NETランタイムをインストールする必要があります。

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

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

次の値はtypeに有効です。

-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の場合は以下を参照してください。 doc 必要に応じてmsiまたはexeを作成できます。

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

Java Service Wrapperのライセンスが好きではありませんでした。私はActiveState Perlを使って仕事をするサービスを書きました。

C#でサービスを書くことを考えましたが、私の時間的制約は厳しすぎました。

2
Hugh Buchanan

私はいつもsc.exeを使います( http://support.Microsoft.com/kb/251192 を参照)。それはSP1からXPにインストールされるべきであり、それがVistaのあなたの味に含まれていない場合は、Vistaリソースキットでそれをダウンロードロードすることができます。

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

2
Kevin

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

Windows 7C:\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サービスを作成します

timeoutになった場合はcmd /c D:\Java7~1\jdk1.7.0_51\bin\Java.exe -jar d:\jenkins\jenkins.warを使用しますが、それでもタイムアウトになりますが、バックグラウンドでJava.exeが起動します。タスクマネージャをチェックインする

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

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

2
Ravi Parekh

さまざまなソリューションのかなり良い比較は、で入手可能です: http://yajsw.sourceforge.net/#mozTocId2845

個人的にはlaunch4jが好きです

2
pushNpop

私は以前に JavaService を使って成功しました。それは数年で更新されていませんが、私がそれを使ったときにはかなりしっかりしていました。

2
Jason

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

チャオ!

1
ramfree17

もう1つの良い選択肢は FireDaemon です。 NASA、IBMなどの大手店で使用されています。完全なリストについては彼らのウェブサイトを見てください。

1
Andrew Swan