我有一个可执行的 JAR 文件。是否可以创建该 JAR 的 Windows 服务?实际上,我只想在启动时运行它,但我不想将该 JAR 文件放在启动文件夹中,也不放在注册表中。
到目前为止我找到的最简单的解决方案是Non-Sucking Service Manager
用法是
nssm install <servicename> "C:\Program Files\Java\jre7\java.exe" "-jar <path-to-jar-file>"
使用 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>"
这应该可以解决服务暂停的问题。
我一直在尝试Apache Commons Daemon。它支持 Windows (Procrun) 和 unix (Jsvc)。高级安装程序有一个Java 服务教程,其中包含可供下载的示例项目。如果您将其 javaservice.jar 作为 Windows 服务运行,则可以使用“telnet 4444”对其进行测试。我使用他们的示例是因为我的重点是运行 java windows 服务,而不是编写 java。
Tanuki 前段时间更改了 jsw 的许可证,如果我要开始一个项目,我会使用 Yet Another Java Service Wrapper,http://yajsw.sourceforge.net/ 这或多或少是一个模仿的开源实现JWS,然后在其基础上进行构建并进一步改进。
编辑:我已经在多个平台(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%
我想
另一个选择是winsw:https://github.com/kohsuke/winsw/
配置一个 xml 文件来指定服务名称、要执行的内容、任何参数等。并使用 exe 进行安装。示例 xml:https://github.com/kohsuke/winsw/tree/master/examples
比起 nssm,我更喜欢这个,因为它是一个轻量级的 exe;并且配置 xml 很容易共享/提交到源代码。
PS 该服务是通过运行安装的
your-service.exe install
[2020更新]
实际上,在花了一些时间尝试这里提供的不同选项(这些选项已经很旧)后,我发现最简单的方法是使用为此目的构建的小型付费工具:FireDaemon Pro。我试图将 Selenium 独立服务器作为服务运行,但没有一个免费选项可以立即运行。
该工具非常便宜(50 美元一次性许可证,30 天试用期),我花了 5 分钟来设置服务器服务,而不是半天的阅读/故障排除。到目前为止,它就像一个魅力。
我与FusionPro完全没有任何联系,这纯粹是无私的建议,但如果违反论坛规则,请随意删除。
我尝试了这里提供的不同选项,这些选项相当旧,我找到了本教程https://eric-ndirangu.medium.com/deploying-a-springboot-application-jar-as-a-windows-service-using-winsw -75314f21d667 它在 5 分钟内对我有用。它使用WinSW。 https://github.com/winsw/winsw/releases