我刚刚继承了一个需要在XP和Vista上作为服务安装的java应用程序.自从我以任何形式使用Windows以来已经过去了大约8年,我从来没有创建过服务,更不用说像java应用程序这样的东西(我有一个应用程序jar和一个依赖jar - log4j ).将此作为服务运行所需的魔力是什么?我有源代码,因此可以进行代码修改,但最好是避免代码修改.
Apache Commons Daemon是一个不错的选择.它Procrun为Windows服务,并JSVC用于UNIX守护进程.它使用限制较少的Apache许可证,Apache Tomcat将其作为自身的一部分在Windows和Linux上运行!要使其工作有点棘手,但有一篇详尽的文章与工作示例.
除此之外,您可以查看Apache Tomcat中的bin\service.bat以了解如何设置服务.在Tomcat中,他们重命名Procrun二进制文件(prunsrv.exe - > tomcat6.exe,prunmgr.exe - > tomcat6w.exe).
我在使用Procrun时遇到的困难,你的start和stop方法必须接受参数(String [] argv).例如"start(String [] argv)"和"stop(String [] argv)"可以工作,但"start()"和"stop()"会导致错误.如果您无法修改这些调用,请考虑创建一个可以按摩这些调用以满足您需求的引导程序类.
我在Java Service Wrapper上运气不错
使用Apache Commons Daemon,您现在可以拥有自定义的可执行文件名称和图标! 您还可以使用自己的名称和图标获得自定义Windows托盘监视器!
我现在使用自己的名称和图标(prunsrv.exe)运行我的服务,系统托盘监视器(prunmgr.exe)也有我自己的自定义名称和图标!
下载Apache Commons Daemon二进制文件(您将需要prunsrv.exe和prunmgr.exe).
将它们重命名为MyServiceName.exe
和MyServiceNamew.exe
.
下载WinRun4J并使用RCEDIT.exe
它附带的程序修改Apache可执行文件以嵌入您自己的自定义图标,如下所示:
> RCEDIT.exe /I MyServiceName.exe customIcon.ico > RCEDIT.exe /I MyServiceNamew.exe customTrayIcon.ico
现在安装这样的Windows服务(有关更多详细信息和选项,请参阅文档):
> MyServiceName.exe //IS//MyServiceName \ --Install="C:\path-to\MyServiceName.exe" \ --Jvm=auto --Startup=auto --StartMode=jvm \ --Classpath="C:\path-to\MyJarWithClassWithMainMethod.jar" \ --StartClass=com.mydomain.MyClassWithMainMethod
现在你有一个Jar的Windows服务,它将使用你自己的图标和名称运行!您还可以启动监视文件,它将使用您自己的图标和名称在系统托盘中运行.
一个简单的方法是NSSM Wrapper Wrapper(参见我的博客文章).
另一个选择是WinRun4J.这是一个可配置的java启动程序,可兼作Windows服务主机(32位和64位版本).它是开源的,对其使用没有限制.
(完全披露:我在这个项目上工作).
另一个答案是Yet Another Service Service Wrapper,这似乎是Java Service Wrapper的一个很好的替代品,因为它有更好的许可.它也很容易从JSW转移到YAJSW.当然,对于我来说,Windows服务器是全新的,并且试图将Java应用程序作为服务运行,它非常容易使用.
我找到的其他一些,但最终没有使用:
Java Service Launcher我没有使用它,因为看起来比YAJSW更复杂.我不认为这是一个包装.
JSmooth Creating Window的服务不是它的主要目标,但可以做到.我没有使用它,因为自2007年以来一直没有活动.
我认为Java Service Wrapper运行良好.请注意,有三种方法可以集成您的应用程序.听起来选项1最适合您,因为您不想更改代码.配置文件可能会有点疯狂,但请记住(对于选项1)您正在启动的程序以及您将为其指定参数的程序是他们的帮助程序,然后它将启动您的程序.他们有一个示例配置文件.
如果您使用Gradle Build Tool,则可以尝试使用Windows-service-plugin,它有助于使用Apache Commons Daemon Procrun。
要使用插件创建Java Windows Service应用程序,您需要执行几个简单的步骤。
使用适当的方法创建一个主服务类。
public class MyService { public static void main(String[] args) { String command = "start"; if (args.length > 0) { command = args[0]; } if ("start".equals(command)) { // process service start function } else { // process service stop function } } }
将插件包含到您的build.gradle
文件中。
buildscript { repositories { maven { url "https://plugins.gradle.org/m2/" } } dependencies { classpath "gradle.plugin.com.github.alexeylisyutenko:windows-service-plugin:1.1.0" } } apply plugin: "com.github.alexeylisyutenko.windows-service-plugin"
用于Gradle 2.1中引入的新的,可孵化的插件机制的相同脚本片段:
plugins { id "com.github.alexeylisyutenko.windows-service-plugin" version "1.1.0" }
配置插件。
windowsService { architecture = 'amd64' displayName = 'TestService' description = 'Service generated with using gradle plugin' startClass = 'MyService' startMethod = 'main' startParams = 'start' stopClass = 'MyService' stopMethod = 'main' stopParams = 'stop' startup = 'auto' }
运行createWindowsService gradle任务以创建Windows服务分发。
这就是创建简单的Windows服务所需要做的。该插件将自动下载Apache Commons Daemon Procrun二进制文件,将此二进制文件解压缩到服务分发目录,并创建用于安装/卸载服务的批处理文件。
在${project.buildDir}/windows-service
目录中,您将找到服务可执行文件,用于安装/卸载服务的批处理脚本以及所有运行时库。要安装服务运行,
以及是否要卸载服务运行
。要启动和停止服务,请使用
可执行文件。
请注意,方法处理服务启动应创建并启动一个单独的线程来执行处理,然后返回。启动和停止服务时,从不同的线程调用main方法。
有关更多信息,请阅读有关插件和Apache Commons Daemon Procrun的信息。