如何从Java应用程序创建Windows服务
我刚刚继承了一个Java应用程序,该应用程序需要作为服务安装在XP和Vista上。自从我以任何形式使用Windows至今已有8年了,而且我从未创建过一项服务,更不用说从Java应用程序之类的东西了了(我为该应用程序提供了一个jar,并且有一个依赖项jar log4j) 。使它作为服务运行所需的魔术是什么?我已经掌握了源代码,因此尽管可以避免进行代码修改,但还是可以的。
解决方案
回答
我对Java Service Wrapper感到很幸运
回答
我以前使用过JavaService并取得了成功。它已经有几年没有更新了,但是当我使用它时,它的确坚如磐石。
回答
我不喜欢Java Service Wrapper的许可。我和ActiveState Perl一起编写了可以完成这项工作的服务。
我曾考虑过用C#编写服务,但时间紧迫。
回答
我总是只使用sc.exe(请参阅http://support.microsoft.com/kb/251192)。它应该从SP1安装在XP上,如果不是Vista风格的,则可以使用Vista资源工具包下载它。
我使用Java并没有做任何复杂的事情,但是使用完全限定的命令行参数(x:\ java.exe ....)或者使用Ant创建脚本以包含依赖关系和设置参数对我来说都很好。
回答
我认为Java Service Wrapper运作良好。请注意,有三种方法可以集成应用程序。鉴于我们不想更改代码,听起来选项1最适合我们。配置文件可能会有些疯狂,但请记住,(对于选项1)我们正在启动的程序(将为其指定参数)是其帮助程序,该程序随后将启动程序。他们为此提供了一个示例配置文件。
回答
另一个不错的选择是FireDaemon。一些大型商店如NASA,IBM等都在使用它。请访问他们的网站以获取完整列表。
回答
我目前需要它来运行基于Eclipse的应用程序,但是我需要首先设置一些对该应用程序本地的变量。 sc.exe仅允许可执行文件,而不允许脚本,因此我转向Windows 2003资源工具包中的autoexnt.exe。它将服务限制为单个批处理文件,但是我只需要将一个批处理脚本转换为服务即可。
再见!
回答
另一种选择是WinRun4J。这是一个可配置的Java启动器,可以兼用作Windows服务主机(32位和64位版本)。它是开源的,对其使用没有任何限制。
(完整披露:我正在从事这个项目)。
回答
JavaService是LGPL。这是非常容易和稳定的。强烈推荐。
回答
Apache Commons Daemon是一个很好的选择。它具有用于Windows服务的Procrun和用于unix守护程序的Jsvc。它使用了限制性较小的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服务包装程序",这似乎可以更好地替代Java Service Wrapper,因为它具有更好的许可。从JSW到YAJSW的迁移也很容易。对于我来说当然是Windows服务器的全新产品,并且试图使Java应用程序作为服务运行,它非常易于使用。
我找到了其他一些,但最终没有使用:
- Java Service Launcher我没有使用它,因为它看起来比YAJSW更复杂。我不认为这是包装纸。
- JSmooth创建Window的服务不是其主要目标,但可以实现。我没有使用它,因为自2007年以来没有任何活动。
回答
可以在以下位置对不同解决方案进行很好的比较:
http://yajsw.sourceforge.net/#mozTocId284533
个人喜欢launch4j