如何从java jar创buildwindows服务?

我有一个可执行的JAR文件。 是否有可能创build该JAR的Windows服务? 实际上,我只是想在启动时运行它,但我不想将该JAR文件放在我的启动文件夹中,既不在registry中。

这篇文章应该告诉你所有你需要知道的: “作为Windows服务运行Java应用程序” ; 它提到使用“ Java服务包装 ”(有一个名为YAJSW的社区版本)

我发现迄今为止最简单的解决scheme是非吸入服务pipe理器

用法是

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

我一直在试验Apache Commons Daemon 。 它支持windows( Procrun )和unix( Jsvc )。 高级安装程序有一个Java服务教程 ,下载一个示例项目。 如果您将javaservice.jar作为Windows服务运行,则可以使用“telnet 4444”进行testing。 我用他们的例子,因为我的重点是获得一个Java的Windows服务运行,而不是写Java。

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

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

这应该修复服务暂停的问题。

Tanuki改变了jsw的许可证,如果我要开始一个项目,我会使用另一个Java服务包装器http://yajsw.sourceforge.net/ ,它或多或less是一个模仿JWS的开源实现,然后build立并进一步改进。

编辑:我一直在几台平台上使用YAJSW几年(Windows,几个linux …),这是伟大的,发展正在进行。

使用procrun,您需要将prunsrv复制到应用程序目录( 下载 ),并创build一个像这样的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
  • 并且你已经closures挂钩到JVM中(例如在Spring中使用context.registerShutdownHook())。
  • 不使用jar之外的文件的相对path(例如log4j应该和log4j.appender.X.File = $ {app.home} /logs/my.log一起使用)

检查procrun 手册和本教程了解更多信息。

我们使用Tanuki服务包装 。 这是非常可configuration的。