我通过运行以下命令将标准可执行jar文件安装为Windows服务:
> prunsrv.exe //IS//"My Service" --Install="C:\path-to-prunsrv.exe" --Jvm=auto \
--Startup=auto --StartMode=jvm --Classpath="C:\path-to-MyService.jar" \
--StartClass=com.mydomain.MyService
我现在可以通过运行以下命令(我正在使用Java 1.6)在控制台模式下运行我的程序:
> prunsrv.exe //TS//"My Service"
当我尝试通过标准Windows服务界面启动服务时,收到以下错误消息:
本地计算机上的MyService服务已启动,然后停止。如果某些服务未被其他服务或程序使用,则会自动停止。
当我尝试以这种方式启动服务时,我的应用程序的日志文件中没有输出。 Window的事件日志(Windows 7 64位)中也没有输出。我该怎么做才能弄清楚为什么这项服务无法运行?
答案 0 :(得分:5)
请勿在服务名称中使用任何空格!
经过数小时的测试并拆分Tomcat并复制它的引导过程后,我的问题的解决方案最终导致当Windows服务名称中有空格时,Apache Commons Daemon(Procrun)无法正常工作
当服务名称中有空格时,它似乎正确地在Windows上安装和注册服务。 Windows注册表项看起来都是正确的。该服务甚至可以在调试(也称为TS或控制台)模式下运行。但是,当运行时,作为Windows启动的实际服务,如果服务安装时服务名称中有空格,则它将失败。
我确信Procrun在失败时会有某种类型的日志输出!良好的日志记录可以使这样的调试问题变得轻而易举。
我确实需要在服务名称中包含多个单词,因此我使用一个单词命名我的服务并使用“DisplayName”参数更改名称:
> prunsrv.exe //IS//MyService --Install="C:\path-to-prunsrv.exe" --Jvm=auto \
--Startup=auto --StartMode=jvm --Classpath="C:\path-to-MyService.jar" \
--StartClass=com.mydomain.MyService --DisplayName="My Service"
答案 1 :(得分:2)
我想提供一些关于'11101101b'上述内容的其他信息。 (这是我的第一篇文章,所以请温柔!)
通过更改命令的 // IS // MyService 部分,我能够通过服务名称中的空格正确安装服务,而不是以下内容,我怀疑是什么他也做到了。 (如果我假设不正确,我会道歉。)请注意,开头双引号位于字符串的开头而不是服务名称的开头。
“// IS //我的服务”
与他的情况一样,服务安装正确并且看起来正确,但它无法启动。通过更改注册表中服务的ImagePath值数据设置,我可以解决这个问题,以便对命令的 // RS //我的服务部分进行相同的更改。因此,注册表值在其数据设置中具有以下内容:
“// RS //我的服务”
一切似乎都没有任何问题。
答案 2 :(得分:1)
此服务器启动和停止是因为服务已完成任务,因此它会自动停止。如果你有一个长期运行的逻辑,它就不会停止。
答案 3 :(得分:-1)