実行可能な JAR ファイルがあります。その JAR の Windows サービスを作成することは可能ですか? 実際には、起動時にそれを実行したいだけですが、その JAR ファイルを起動フォルダーにもレジストリにも配置したくありません。
7 に答える
これまでに見つけた最も簡単な解決策は、Non-Sucking Service Managerです。
使用法は
nssm install <servicename> "C:\Program Files\Java\jre7\java.exe" "-jar <path-to-jar-file>"
nssm.exe を使用しますが、AppDirectory を設定しないと、必要なライブラリやリソースにアクセスできなくなります。デフォルトでは、nssm は現在の作業ディレクトリを、jar ではなくアプリケーションの java.exe に設定します。バッチ スクリプトを作成するには、次のようにします。
pushd <path-to-jar>
nssm.exe install "<service-name>" "<path-to-java.exe>" "-jar <name-of-jar>"
nssm.exe set "<service-name>" AppDirectory "<path-to-jar>"
これにより、サービスの一時停止の問題が修正されます。
私はApache Commons Daemonを試してきました。Windows ( Procrun ) と UNIX ( Jsvc ) をサポートしています。Advanced Installer には、ダウンロードするサンプル プロジェクトを含むJava サービス チュートリアルがあります。javaservice.jar を Windows サービスとして実行している場合は、「telnet 4444」を使用してテストできます。私はJavaを書くのではなく、Java Windowsサービスを実行することに重点を置いていたので、彼らの例を使用しました。
タヌキはしばらく前に jsw のライセンスを変更しました。もし私がプロジェクトを始めるとしたら、多かれ少なかれ JWS を模倣したオープン ソース実装であるhttp://yajsw.sourceforge.net/を使用します。次に、それを基に構築し、さらに改善します。
編集: 私はいくつかのプラットフォーム (Windows、いくつかの Linux...) で YAJSW を数年間使用してきました。
procrun を使用して、prunsrv をアプリケーション ディレクトリ ( download ) にコピーし、次のように install.bat を作成する必要があります。
set PR_PATH=%CD%
SET PR_SERVICE_NAME=MyService
SET PR_JAR=MyService.jar
SET START_CLASS=org.my.Main
SET START_METHOD=main
SET STOP_CLASS=java.lang.System
SET STOP_METHOD=exit
rem ; separated values
SET STOP_PARAMS=0
rem ; separated values
SET JVM_OPTIONS=-Dapp.home=%PR_PATH%
prunsrv.exe //IS//%PR_SERVICE_NAME% --Install="%PR_PATH%\prunsrv.exe" --Jvm=auto --Startup=auto --StartMode=jvm --StartClass=%START_CLASS% --StartMethod=%START_METHOD% --StopMode=jvm --StopClass=%STOP_CLASS% --StopMethod=%STOP_METHOD% ++StopParams=%STOP_PARAMS% --Classpath="%PR_PATH%\%PR_JAR%" --DisplayName="%PR_SERVICE_NAME%" ++JvmOptions=%JVM_OPTIONS%
だと思います
- jar と prunsrv.exe がある同じディレクトリからこれを実行します。
- jarには機能するMANIFEST.MFがあります
- JVMに登録されたシャットダウンフックがあります(たとえば、Springのcontext.registerShutdownHook()を使用)...
- jar 以外のファイルに相対パスを使用しない (たとえば、log4j はlog4j.appender.X.File=${app.home}/logs/my.logなどと一緒に使用する必要があります)