如何从java jar创建Windows服务?

Rak*_*yal 54 java windows-services jar startup

我有一个可执行的JAR文件.是否可以创建该JAR的Windows服务?实际上,我只想在启动时运行它,但我不想将JAR文件放在我的启动文件夹中,也不要在注册表中.

kop*_*nik 47

到目前为止,我找到的最简单的解决方案是非吸吮服务管理器

用法是

nssm install <servicename> "C:\Program Files\Java\jre7\java.exe" "-jar <path-to-jar-file>"
Run Code Online (Sandbox Code Playgroud)

  • 我做了同样的事情并且安装成功,但是一旦我运行它,它就会出现"意外状态SERVICE-PAUSED以响应START控制" (7认同)
  • 迟到了,但关于错误“响应 START 控制的意外状态 SERVICE_PAUSED”。这发生在我身上,因为 Java 应用程序是一个简单的“hello world”应用程序,它确实写入控制台并存在。我认为启动服务太快以至于无法完全注册,因此添加更多代码以保持服务运行更长时间解决了这个问题。 (2认同)

Adr*_*ian 17

本文应该告诉您所有需要知道的事项: "将Java应用程序作为Windows服务运行" ; 它提到使用" Java Service Wrapper "(有一个名为YAJSW的社区版)


小智 17

使用nssm.exe但请记住设置AppDirectory或无法访问任何所需的库或资源.默认情况下,nssm将当前工作目录设置为应用程序java.exe的目录,而不是jar.这样做是为了创建一个批处理脚本:

    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>"
Run Code Online (Sandbox Code Playgroud)

这应该可以解决服务暂停的问题.

  • 在我的情况下,在创建服务后设置 AppDirectory 失败。但是您可以使用 `nssm install &lt;servicename&gt;` 启动一个 gui 并设置 AppDirectory 以及其他有用的参数,例如那里的日志文件,然后一次性创建服务 (2认同)

mcd*_*don 10

我一直在试验Apache Commons Daemon.它支持windows(Procrun)和unix(Jsvc).Advanced Installer有一个Java Service教程,下载了一个示例项目.如果你把他们的javaservice.jar作为windows服务运行,你可以使用"telnet 4444"进行测试.我使用他们的例子是因为我的重点是让java windows服务运行,而不是编写java.


Per*_*ium 7

狸改变JSW的许可前一段时间,如果我是开始的一个项目,我会用但另一个Java服务包装,http://yajsw.sourceforge.net/是或多或少的开源实现模仿JWS,并然后建立在它上面并进一步改进它.

编辑:我已经在几个平台(Windows,几个Linux ......)上使用YAJSW多年了,它很棒,开发正在进行中.


BTa*_*acs 5

使用 procrun,您需要将 prunsrv 复制到应用程序目录(下载),并创建一个 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%
Run Code Online (Sandbox Code Playgroud)

我认为

  • 从 jar 和 prunsrv.exe 所在的同一目录运行它
  • 罐子有它的工作 MANIFEST.MF
  • 并且您已将关闭挂钩注册到 JVM(例如在 Spring 中使用 context.registerShutdownHook())...
  • 不使用 jar 外部文件的相对路径(例如 log4j 应该与log4j.appender.X.File=${app.home}/logs/my.log或类似的东西一起使用)

查看 procrun手册本教程以获取更多信息。