如何从Java应用程序创build一个Windows服务

我刚刚inheritance了一个Java应用程序,需要在XP和Vista上作为服务安装。 大约8年以来,我以任何forms使用windows,而且我从来不需要创build一个服务,更不用说像java应用程序这样的东西了(我有一个应用程序和一个依赖jar的jar包–log4j )。 将这个服务作为一个服务运行的魔法是什么? 我有源代码,所以尽pipe最好避免代码修改是可能的。

我已经与Java服务包装有一些运气

Apache Commons守护进程是一个很好的select。 它有Procrun for windows服务,而Jsvc用于unix守护进程。 它使用限制较less的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()”会导致错误。 如果你不能修改这些调用,考虑做一个引导程序类,可以按摩这些调用,以适应您的需求。

使用Apache Commons Daemon,您现在可以拥有自定义的可执行文件名称和图标! 您也可以使用自己的名称和图标来获得自定义的Windows托盘监视器!

我现在有我的服务运行与我自己的名称和图标(prunsrv.exe),系统托盘监视器(prunmgr.exe)也有我自己的自定义名称和图标!

  1. 下载Apache Commons Daemon二进制文件 (您将需要prunsrv.exe和prunmgr.exe)。
  2. 将它们分别重命名为MyServiceName.exeMyServiceNamew.exe
  3. 下载WinRun4J并使用随附的RCEDIT.exe程序来修改Apache可执行文件,以embedded您自己的自定义图标,如下所示:

     > RCEDIT.exe /I MyServiceName.exe customIcon.ico > RCEDIT.exe /I MyServiceNamew.exe customTrayIcon.ico 
  4. 现在就像这样安装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 
  5. 现在你有一个你的Jar的Windows服务,可以运行你自己的图标和名字! 您也可以启动监视器文件,并使用您自己的图标和名称在系统托盘中运行。

还有一个select是WinRun4J 。 这是一个可configuration的Java启动器,兼容Windows服务主机(32位和64位版本)。 它是开源的,对它的使用没有限制。

(全面披露:我在这个项目上工作)。

一个简单的方法是NSSM Wrapper Wrapper( 参见我的博客条目 )。

另一个答案是另一个Java服务包装器 ,这看起来像Java Service Wrapper的一个很好的替代品,因为它具有更好的许可。 这也是很容易从JSW转移到YAJSW。 当然,对我来说,崭新的Windows服务器,并试图让一个Java应用程序作为服务运行,这是非常容易使用。

我发现了一些其他人,但没有结束使用:

  • Java服务启动器我没有使用这个,因为它看起来比YAJSW工作更复杂。 我不认为这是一个包装。
  • JSmooth创buildWindow的服务不是它的主要目标,但可以完成 。 我没有使用这个,因为自2007年以来没有任何活动。

我认为Java服务包装工作正常。 请注意,有三种方式来整合您的应用程序。 这听起来像选项1将最适合你,因为你不想改变代码。 configuration文件可能会变得有点疯狂,但是请记住(对于选项1),您要启动的程序以及您将为其指定参数的程序是其辅助程序,然后该程序将启动您的程序。 他们有一个这样的configuration文件的例子 。

JavaService是LGPL。 这是非常简单和稳定的。 强烈推荐。

使用为“Glassfish v3”编写的“ winsw ”,但通常与Java程序配合使用。

需要安装.NET运行时。

有关不同解决scheme的很好的比较,请访问:http: //yajsw.sourceforge.net/#mozTocId284533

个人喜欢launch4j

使用Java 8,我们无需任何外部工具即可处理这种情况。 Java 8的javapackager工具提供了一个选项来创build自包含的应用程序包:

-nativetypes生成自包含的应用程序包(如果可能的话)。 使用-B选项为正在使用的捆绑器提供参数。 如果指定了type,那么只会创build一个这种types的包。 如果没有指定types,则全部使用。

以下值对于types有效:

 -native type Generate self-contained application bundles (if possible). Use the -B option to provide arguments to the bundlers being used. If type is specified, then only a bundle of this type is created. If no type is specified, all is used. The following values are valid for type: all: Runs all of the installers for the platform on which it is running, and creates a disk image for the application. This value is used if type is not specified. installer: Runs all of the installers for the platform on which it is running. image: Creates a disk image for the application. On OS X, the image is the .app file. On Linux, the image is the directory that gets installed. dmg: Generates a DMG file for OS X. pkg: Generates a .pkg package for OS X. mac.appStore: Generates a package for the Mac App Store. rpm: Generates an RPM package for Linux. deb: Generates a Debian package for Linux. 

在Windows的情况下,请参考下面的文档,我们可以根据需要创buildmsi或exe 文件 。

 exe: Generates a Windows .exe package. msi: Generates a Windows Installer package. 

我以前使用JavaService取得了很好的成功。 这几年还没有更新,但是当我使用它时,它已经非常稳定了。

我不喜欢Java Service Wrapper的许可。 我使用ActiveState Perl编写了一个可以完成这项工作的服务。

我想用C#编写一个服务,但是我的时间限制太紧。

我总是只使用sc.exe(请参阅http://support.microsoft.com/kb/251192 )。 它应该安装在SP1的XP上,如果它不是Vista的风格,你可以下载加载Vista资源工具包。

我没有做任何太复杂的Java,但使用完全合格的命令行参数(x:\ java.exe ….)或创build一个脚本与Ant包括依赖和设置参数对我来说工作正常。

另一个不错的select是FireDaemon 。 它被美国宇航局,IBM等大型商店所使用; 看他们的网站的完整列表。

我目前要求这个运行一个基于Eclipse的应用程序,但我需要首先设置一些本地的应用程序的variables。 sc.exe将只允许可执行文件,但不支持脚本,所以我转而使用属于Windows 2003资源工具包的 autoexnt.exe。 它将服务限制在一个batch file中,但我只需要将一个批处理脚本转换为一个服务。

再见!

这很简单,因为你必须把快捷方式

Windows 7 C:\users\All Users\Start Menu\Programs\Startup (pipe理员)或User home directory(%userProfile%)

Windows 10:在运行shell:startup

在它的属性 – >快捷方式 – >目标 – > java.exe -jar D:\..\runJar.jar

注意:这将只在您login后运行


与pipe理权限

sc create serviceName binpath= "java.exe -jar D:\..\runJar.jar"将创buildwindows服务

如果你超时使用cmd /c D:\JAVA7~1\jdk1.7.0_51\bin\java.exe -jar d:\jenkins\jenkins.war但是即使如此,你也会得到超时但是在后台java.exe将开始。 检查任务pipe理器

注意:这将在Windowslogin启动时运行(在login之前,基于服务“ Startup Type ”)

创buildWindows服务的详细说明

如果你使用Gradle构build工具,你可以尝试我的windows-service-plugin ,这有助于使用Apache Commons Daemon Procrun 。

要创build一个Java的Windows服务应用程序与插件,你需要经过几个简单的步骤。

  1. 用适当的方法创build一个主要的服务类。

     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 } } } 
  2. 将插件包含到build.gradle文件中。

     buildscript { repositories { maven { url "https://plugins.gradle.org/m2/" } } dependencies { classpath "gradle.plugin.com.github.alexeylisyutenko:windows-service-plugin:1.0.1" } } apply plugin: "com.github.alexeylisyutenko.windows-service-plugin" 

    Gradle 2.1中引入的新的孵化插件机制的相同脚本片段:

     plugins { id "com.github.alexeylisyutenko.windows-service-plugin" version "1.0.1" } 
  3. configuration插件。

     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' } 
  4. 运行createWindowsService gradle任务来创buildWindows服务分发。

这就是所有你需要做的创build一个简单的Windows服务。 该插件将自动下载Apache Commons Daemon Procrun二进制文件,将此二进制文件解压缩到服务分发目录,并创build用于安装/卸载服务的batch file。

${project.buildDir}/windows-service目录中,您可以find服务可执行文件,用于安装/卸载服务的批处理脚本以及所有运行时库。 要安装服务,运行<project-name>-install.bat ,如果要卸载服务,运行<project-name>-uninstall.bat 。 要启动和停止服务,请使用<project-name>w.exe可执行文件。

请注意,处理服务启动的方法应该创build并启动一个单独的线程来执行处理,然后返回。 主要方法是在启动和停止服务时从不同的线程中调用。

有关更多信息,请阅读有关插件和Apache Commons Daemon Procrun。

Exe4j是一个非常好的select,虽然它不是免费的。 在Exe4j检查它在向导中创build.exe文件,您可以select创build一个服务。