首页 / 知识
如何从Java应用程序创建Windows服务
2023-04-15 16:13:00

How to create a windows service from java app我刚刚继承了一个Java应用程序,该应用程序需要作为服务安装在XP和Vista上。 自从我以任何形式使用Windows至今已有大约8年的时间,而且我从未创建过服务,更不用说从Java应用程序之类的东西了了(我为该应用程序提供了一个jar,并且有一个依赖项jar-log4j)。 使它作为服务运行所需的魔术是什么? 我已经知道了源代码,因此尽管可以避免进行代码修改,但还是可以的。 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 Service Wrapper感到很幸运 使用Apache Commons Daemon,您现在可以拥有一个自定义的可执行文件名称和图标!您还可以获得带有您自己的名称和图标的自定义Windows托盘监视器! 我现在使用自己的名称和图标(prunsrv.exe)运行服务,并且系统任务栏监视器(prunmgr.exe)也使用自己的自定义名称和图标!
下载WinRun4J并使用其随附的
现在像这样安装Windows服务(有关更多详细信息和选项,请参阅文档):
现在,您有了Jar的Windows服务,它将以您自己的图标和名称运行!您也可以启动监视器文件,它将以自己的图标和名称在系统托盘中运行。 一种简单的方法是NSSM Wrapper Wrapper(请参阅我的博客文章)。 另一种选择是WinRun4J。这是一个可配置的Java启动器,可以兼用作Windows服务主机(32位和64位版本)。它是开源的,对其使用没有任何限制。 (完整披露:我正在从事这个项目)。 另一个答案是"另一个Java服务包装程序",这似乎可以更好地替代Java服务包装程序,因为它具有更好的许可。从JSW到YAJSW的迁移也很容易。对于我来说当然是Windows服务器的全新产品,并且试图使Java应用程序作为服务运行,它非常易于使用。 我找到了其他一些,但最终没有使用:
我认为Java Service Wrapper运作良好。请注意,有三种方法可以集成您的应用程序。听起来,如果您不想更改代码,那么选项1最适合您。配置文件可能会有些疯狂,但请记住,(对于选项1)您正在启动的程序(将为其指定参数)是其帮助程序,该程序随后将启动您的程序。他们为此提供了一个示例配置文件。 如果您使用Gradle Build Tool,则可以尝试我的windows-service-plugin,它有助于使用Apache Commons Daemon Procrun。 要使用插件创建Java Windows Service应用程序,您需要执行几个简单的步骤。 使用适当的方法创建一个主服务类。
将插件包含在您的
用于Gradle 2.1中引入的新的,可孵化的插件机制的相同脚本片段:
配置插件。
运行createWindowsService gradle任务以创建Windows服务分发。 这就是创建简单的Windows服务所需要做的。该插件将自动下载Apache Commons Daemon Procrun二进制文件,将此二进制文件解压缩到服务分发目录,并创建用于安装/卸载服务的批处理文件。
在 请注意,方法处理服务启动应创建并启动一个单独的线程来执行处理,然后返回。启动和停止服务时,从不同的线程调用main方法。 有关更多信息,请阅读有关插件和Apache Commons Daemon Procrun的信息。 使用Java 8,我们无需任何外部工具即可处理这种情况。 Java 8附带的javapackager工具提供了一个创建自包含应用程序捆绑包的选项:
本机类型 以下值对类型有效:
如果是Windows,请参考以下文档,我们可以根据需要创建msi或exe。
JavaService是LGPL。这是非常容易和稳定的。强烈推荐。 使用为Glassfish v3编写的" winsw",但通常可以与Java程序一起很好地工作。 需要安装.NET运行时。
可以在以下位置对不同解决方案进行很好的比较: 个人喜欢launch4j 这很简单,因为您必须输入快捷方式
Windows 7的
Windows 10:
在它的属性->快捷方式->目标-> 注意:此操作仅在您登录后运行 具有管理员权限
如果超时,请使用
注意:这将在Windows登录启动时运行(登录之前,基于服务' 创建Windows服务的详细说明 我总是只使用sc.exe(请参阅http://support.microsoft.com/kb/251192)。它应该从SP1安装在XP上,如果不是Vista风格的,则可以使用Vista资源工具包下载它。 我使用Java并没有做任何复杂的事情,但是使用完全限定的命令行参数(x: java.exe ....)或使用Ant创建脚本以包含依赖关系和设置参数对我来说都很好。 我不喜欢Java Service Wrapper的许可。我和ActiveState Perl一起编写了可以完成这项工作的服务。 我曾考虑过用C#编写服务,但是时间紧迫。 我以前使用过JavaService并取得了成功。它已经有两年没有更新了,但是当我使用它时,它的确坚如磐石。 我目前需要它来运行基于Eclipse的应用程序,但是我需要首先设置一些对该应用程序本地的变量。 sc.exe仅允许可执行文件,而不允许脚本,因此我转向Windows 2003资源工具包中的autoexnt.exe。它将服务限制为单个批处理文件,但是我只需要将一个批处理脚本转换为服务即可。 再见! 另一个不错的选择是FireDaemon。 NASA,IBM等一些大型商店都在使用它。请访问他们的网站以获取完整列表。 尽管它不是免费的,但Exe4j是一个非常好的选择。在Exe4j上签出。在创建.exe文件的向导中,可以选择创建服务。 |
最新内容
相关内容
linux创建分区命令是?
linux创建分区命令是?,系统,工具,分区,电脑,情况,位置,网络,信息,数据,环境,在LINUX系统中,分区与格式化硬盘的命令是什么?fdisk/sfdisk:命令行linux7关闭服务命令?
linux7关闭服务命令?,系统,软件,服务,命令,电脑,状态,工具,管理,进程,用户,求Linux关机命令详解shutdown命令 shutdown命令用于安全关闭Linuxlinux创建pc端命令?
linux创建pc端命令?,名字,系统,密码,名称,图片,环境,软件,首次,文件夹,命令,Linux虚拟机命令如何创建新的文件和文件夹首先,连接相应linux主机,linux命令行创建组?
linux命令行创建组?,系统,代码,密码,软件,用户组,用户,命令,选项,用户名,文件夹,linux命令界面中怎么新建用户组1、打开xshell软件,远程访问您linux创建密码命令?
linux创建密码命令?,密码,系统,地址,联系方式,软件,用户,用户名,位置,管理,命令,linux系统怎么创建一个用户为英文名字,密码为lewis,1、首先需服务启动linux命令?
服务启动linux命令?,服务,密码,信息,系统,名称,命令,文件,用户,下面,服务器,linux如何启动mysql服务1、首先,我们需要修改mysql的配置文件,一般linux服务器命令框?
linux服务器命令框?,系统,情况,状态,信息,数据,软件,指标,服务,在线,工具,linux系统怎样查看服务器性能命令1、使用top命令 top命令是一个常用服务器linux命令教程?
服务器linux命令教程?,系统,地址,密码,网络,设备,工作,服务,标准,连续,管理,重启服务器的linux命令1、首先我首要把linux开机, 命令 rebot 这个linux开机服务命令行?
linux开机服务命令行?,系统,工作,地址,信息,服务,设备,数字,第一,设计,发行,linux常用命令有哪些1、linux系统常用操作命令linux系统常用操作linux创建命令简写?
linux创建命令简写?,系统,数据,命令,文件,环境,档案,位置,文件夹,目录,终端,LINUX中,创建文件夹、文件命令及清除命令。1、创建文件夹mkdir命linux命令创建pkg?
linux命令创建pkg?,名称,文件,命令,系统,首次,数据,位置,不了,时间,名字,linux新建文件命令是什么?1、终端下键入:touch加文件名,这样就创建了一linux服务器分区命令?
linux服务器分区命令?,系统,管理,信息,设备,时间,命令,基础,首次,平均,情况,linux系统格式化分区用哪个命令Linux的磁盘格式化命令是“mkfs”,