如何从java jar创建Windows服务?
-
06-07-2019 - |
题
我有一个可执行的 JAR 文件。是否可以创建该 JAR 的 Windows 服务?实际上,我只想在启动时运行它,但我不想将该 JAR 文件放在启动文件夹中,也不放在注册表中。
解决方案
这篇文章应该告诉你所有你需要知道的事情: “将Java应用程序作为Windows服务运行”;它提到使用“ Java Service Wrapper ” (有一个名为 YAJSW 的社区版)
其他提示
到目前为止,我找到的最简单的解决方案是非吸吮服务管理器
用法是
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 )。 Advanced Installer有一个示例项目的 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 复制到应用程序目录(下载),然后创建一个 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 所在的同一目录运行它
- 该罐子有其工作 MANIFEST.MF
- 并且您已将关闭钩子注册到 JVM 中(例如在 Spring 中使用 context.registerShutdownHook() )...
- 不使用 jar 外部文件的相对路径(例如 log4j 应该与 log4j.appender.X.File=${app.home}/logs/my.log 或类似的东西)
我们使用 Tanuki Service Wrapper 。它非常易于配置。
另一个选择是winsw: https://github.com/kohsuke/winsw/
配置xml文件以指定服务名称,要执行的内容,任何参数等。并使用exe进行安装。示例xml: https://github.com/kohsuke/winsw/tree/master/examples
我更喜欢这个,因为它是一个轻量级的exe;并且config xml很容易共享/提交源代码。
通过运行 your-service.exe install