【问题标题】:How to create windows service from java jar?如何从 java jar 创建 windows 服务?
【发布时间】:2010-12-09 16:50:44
【问题描述】:

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

【问题讨论】:

  • 不在注册表中?那你为什么要它作为服务呢?
  • @o.k.w 是正确的,如果您正在创建 Windows 服务,它将在注册表中创建条目。
  • 我认为这个用户的意思是“作为服务运行,而不是从启动注册表项作为非服务运行”
  • 您可以使用 java 8 以上的 javapackager 工具直接从 java 创建 exe 或 msi 文件。参考:stackoverflow.com/questions/68113/…

标签: java windows-services jar startup


【解决方案1】:

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

用法是

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

【讨论】:

  • 我做了同样的事情,它安装成功,但我一运行它,它说unexpected status SERVICE-PAUSED in response to START control
  • 这个问题和你提到的一样。知道有什么问题吗?
  • 和你们提到的一样的问题..解决方案有什么更新吗?
  • 您可以运行nssm install &lt;servicename&gt;,然后交互式管理所有选项(有很多)。
  • 聚会迟到了,但关于错误Unexpected status SERVICE_PAUSED in response to START control。这发生在我身上,因为 java 应用程序是一个简单的“hello world”应用程序,它确实写入控制台并存在。我认为启动服务太快而无法完全注册,因此添加更多代码以使服务运行更长时间解决了这个问题。
【解决方案2】:

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

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

【讨论】:

  • 这很好......您应该将其作为评论添加到 kopernik 的答案中。
  • 在我的情况下,在创建服务后设置 AppDirectory 失败。但是您可以使用nssm install &lt;servicename&gt; 启动一个 gui 并设置 AppDirectory 以及其他有用的参数,例如那里的日志文件并一次性创建服务
【解决方案3】:

我一直在尝试Apache Commons Daemon。它支持 windows (Procrun) 和 unix (Jsvc)。 Advanced Installer 有一个 Java Service tutorial 和一个示例项目可供下载。如果您让他们的 javaservice.jar 作为 Windows 服务运行,您可以使用“telnet 4444”对其进行测试。我使用了他们的示例,因为我的重点是让 java windows 服务运行,而不是编写 java。

【讨论】:

  • 对于 Windows 服务,WinRun4j 也是一个不错的选择。它可以兼作 Java 启动器或服务包装器。
  • 警告:Apache Commons Daemon 的文档很糟糕
【解决方案4】:

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

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

【讨论】:

    【解决方案5】:

    使用 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 了解更多信息。

    【讨论】:

    • 有什么例子可以分享一下吗?
    • 感谢 BTakacs,我已经查看了您的教程,它运行良好。但不幸的是,这并没有解决我想做的事情。我现在正试图从 C# 实现这一目标。
    • 好吧,在这种情况下,您应该检查答案:stackoverflow.com/a/15115104/566006
    【解决方案6】:

    另一个选项是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安装的

    【讨论】:

      【解决方案7】:

      [2020 年更新]

      实际上,在尝试了这里提供的不同选项后,我发现最简单的方法是使用为此目的构建的小型付费工具:FireDaemon Pro。我试图将 Selenium 独立服务器作为服务运行,但没有一个免费选项可以立即运行。

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

      我与 FusionPro 完全没有任何联系,这是一个纯粹的中立建议,但如果它违反了论坛规则,请随时删除。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多