XPとVistaにサービスとしてインストールする必要があるJavaアプリケーションを継承しました。私が何らかの形でウィンドウを使用してから、サービスを作成する必要がなくなってから8年になります。Javaアプリのようなものからは言うまでもありません(アプリ用のjarと単一の依存性jarを持っています-log4j )。これをサービスとして実行するために必要な魔法は何ですか?私はソースを持っているので、コードの変更は、できれば避けられますが、可能です。
XPとVistaにサービスとしてインストールする必要があるJavaアプリケーションを継承しました。私が何らかの形でウィンドウを使用してから、サービスを作成する必要がなくなってから8年になります。Javaアプリのようなものからは言うまでもありません(アプリ用のjarと単一の依存性jarを持っています-log4j )。これをサービスとして実行するために必要な魔法は何ですか?私はソースを持っているので、コードの変更は、できれば避けられますが、可能です。
回答:
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()」はエラーを引き起こします。これらの呼び出しを変更できない場合は、それらの呼び出しをニーズに合わせてマッサージできるブートストラップクラスを作成することを検討してください。
--JvmOptions=-Dopt=a#-Dopt2=b
。私はantスクリプトからコマンドを実行していて、そのため何日も苦労していました。それが役に立てば幸い。
Apache Commonsのデーモンあなたは今、カスタム実行可能ファイル名とアイコンを持つことができます! 独自の名前とアイコンが付いたカスタムWindowsトレイモニターを入手することもできます。
これで、自分のサービスを自分の名前とアイコン(prunsrv.exe)で実行できます。システムトレイモニター(prunmgr.exe)にも独自のカスタム名とアイコンがあります。
MyServiceName.exe
をMyServiceNamew.exe
それぞれとに変更します。WinRun4JをダウンロードしRCEDIT.exe
、付属のプログラムを使用して、次のように独自のカスタムアイコンを埋め込むようにApache実行可能ファイルを変更します。
> RCEDIT.exe /I MyServiceName.exe customIcon.ico
> RCEDIT.exe /I MyServiceNamew.exe customTrayIcon.ico
次のように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
これで、独自のアイコンと名前で実行されるJarのWindowsサービスができました。モニターファイルを起動して、独自のアイコンと名前でシステムトレイで実行することもできます。
簡単な方法は、NSSMラッパーラッパーです(私のブログエントリを参照)。
もう1つのオプションはWinRun4Jです。これは、Windowsサービスホスト(32ビットバージョンと64ビットバージョンの両方)を兼ねる構成可能なJavaランチャーです。これはオープンソースであり、その使用に関する制限はありません。
(完全な開示:私はこのプロジェクトに取り組んでいます)。
さらに別の答えは、Yet Another Java Service Wrapperです。これは、ライセンスが優れているため、Java Service Wrapperの優れた代替手段のようです。また、JSWからYAJSWへの移行を容易にすることも目的としています。確かに、私にとっては、Windowsサーバーの新製品であり、Javaアプリをサービスとして実行しようとすることは、非常に簡単でした。
私が見つけたが、最終的には使用しなかった他のいくつか:
Java Service Wrapperはうまく機能すると思います。アプリケーションを統合するには3つの方法があることに注意してください。コードを変更したくない場合、オプション1が最適です。構成ファイルは少しおかしくなりますが、(オプション1の場合)開始しているプログラムが引数を指定するのは、プログラムを開始するヘルパープログラムであることを覚えておいてください。彼らは持っているサンプル設定ファイルこのために。
Gradleビルドツールを使用している場合は、Apache Commons Daemon Procrunの使用を容易にするmy -windows-service-pluginを試すことができます。
プラグインを使用してJava Windowsサービスアプリケーションを作成するには、いくつかの簡単な手順を実行する必要があります。
適切なメソッドでメインサービスクラスを作成します。
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
}
}
}
プラグインを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"
}
プラグインを設定します。
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'
}
ファイル名を指定して実行createWindowsService Windowsサービスの分布を作成するために、Gradleのタスク。
シンプルなWindowsサービスを作成するために必要なことは、これだけです。プラグインは、Apache Commons Daemon Procrunバイナリを自動的にダウンロードし、このバイナリをサービス配布ディレクトリに抽出して、サービスのインストール/アンインストール用のバッチファイルを作成します。
では${project.buildDir}/windows-service
ディレクトリあなたは、サービスのインストール/アンインストールし、すべてのランタイムライブラリのためのバッチスクリプトをサービス実行可能ファイルを見つけます。サービス実行をインストールする<project-name>-install.bat
場合、およびサービス実行をアンインストールする場合<project-name>-uninstall.bat
。サービスを開始および停止するには、<project-name>w.exe
executableを使用します。
サービスの開始を処理するメソッドは、処理を実行するために別のスレッドを作成して開始し、その後に戻る必要があることに注意してください。mainメソッドは、サービスを開始および停止するときに異なるスレッドから呼び出されます。
詳細については、プラグインとApache Commons Daemon Procrunについてお読みください。
JavaServiceはLGPLです。とても簡単で安定しています。強くお勧めします。
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.
さまざまなソリューションのかなり良い比較は、http://yajsw.sourceforge.net/#mozTocId284533で入手できます。
個人的にはlaunch4jが好き
ショートカットを入れる必要があるので簡単です
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
'に基づいて)
Java Service Wrapperのライセンスが気に入らなかった。ActiveState Perlを使用して、この作業を行うサービスを作成しました。
C#でサービスを作成することを考えましたが、時間の制約が厳しすぎました。
私は常にsc.exeを使用しています(http://support.microsoft.com/kb/251192を参照)。SP1からXPにインストールする必要があります。Vistaの趣味に合わない場合は、Vistaリソースキットでダウンロードしてロードできます。
私はJavaであまり複雑なことはしていませんが、完全修飾されたコマンドライン引数(x:\ java.exe ....)を使用するか、依存関係を含めてパラメーターを設定するためにAntでスクリプトを作成することでうまくいきます。
別の良いオプションはFireDaemonです。NASA、IBMなどのいくつかの大きな店で使用されています。完全なリストについては、Webサイトを参照してください。
私は現在、Eclipseベースのアプリケーションを実行するためにこれを必要としていますが、そのアプリケーションに対してローカルな変数を最初に設定する必要があります。sc.exeは実行可能ファイルのみを許可し、スクリプトは許可しないため、Windows 2003リソースキットの一部であるautoexnt.exeを使用しました。サービスを単一のバッチファイルに制限しますが、サービスに変換する必要があるのは1つのバッチスクリプトだけです。
チャオ!