如何从java jar创建Windows服务?

时间:2009-10-24 09:15:04

标签: java windows-services jar startup

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

9 个答案:

答案 0 :(得分:44)

到目前为止,我找到的最简单的解决方案是Non-Sucking Service Manager

用法是

nssm install <servicename> "C:\Program Files\Java\jre7\java.exe" "-jar <path-to-jar-file>"

答案 1 :(得分:16)

这篇文章应该告诉你所有你需要知道的事情: "Running Java Applications as a Windows Service";它提到使用“Java Service Wrapper”(有一个名为YAJSW的社区版本)

答案 2 :(得分:15)

使用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>"

这应解决服务暂停问题。

答案 3 :(得分:10)

我一直在试验Apache Commons Daemon。它支持windows(Procrun)和unix(Jsvc)。高级安装程序有一个Java Service tutorial,其中包含要下载的示例项目。如果你把他们的javaservice.jar作为windows服务运行,你可以使用“telnet 4444”进行测试。我使用他们的例子是因为我的重点是让java windows服务运行,而不是编写java。

答案 4 :(得分:7)

Tanuki不久前改变了jsw的许可证,如果我要开始一个项目,我会使用Yet Another Java Service Wrapper,http://yajsw.sourceforge.net/或多或少是一个模仿JWS的开源实现,然后构建在它上面并进一步改进它。

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

答案 5 :(得分:3)

使用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 或类似的东西一起使用)

检查procrun manualthis tutorial以获取更多信息。

答案 6 :(得分:1)

我们使用Tanuki Service Wrapper。它非常易于配置。

答案 7 :(得分:0)

另一个选项是winsw:https://github.com/kohsuke/winsw/

配置xml文件以指定服务名称,要执行的内容,任何参数等。并使用exe进行安装。示例xml:https://github.com/kohsuke/winsw/tree/master/examples

我更喜欢这个,因为它是一个轻量级的exe;并且config xml很容易共享/提交源代码。

通过运行your-service.exe install

来安装服务

答案 8 :(得分:0)

[2020更新]

实际上,在花了一些时间尝试这里提供的已久的其他选项之后,我发现最简单的方法是使用为此目的而构建的小型付费工具:FireDaemon Pro。我试图将Selenium独立服务器作为服务运行,但是free选项都无法立即起作用。

该工具非常便宜(50美元的一次性许可证,需要30天的试用期),我花了5分钟的时间来设置服务器服务,而不是花了半天的时间进行阅读/故障排除。到目前为止,它的工作原理就像是一种魅力。

我绝对不与FusionPro保持联系,这是纯粹无私的建议,但是如果它违反论坛规则,则可以删除。