如何从java应用程序创建Windows服务

ide*_*tor 216 java windows-services

我刚刚继承了一个需要在XP和Vista上作为服务安装的java应用程序.自从我以任何形式使用Windows以来已经过去了大约8年,我从来没有创建过服务,更不用说像java应用程序这样的东西(我有一个应用程序jar和一个依赖jar - log4j ).将此作为服务运行所需的魔力是什么?我有源代码,因此可以进行代码修改,但最好是避免代码修改.

mcd*_*don 98

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()"会导致错误.如果您无法修改这些调用,请考虑创建一个可以按摩这些调用以满足您需求的引导程序类.

  • @ 11101101b,apache似乎已将文章的内容附加到其[自己的维基页面](http://wiki.apache.org/commons/Daemon)... (3认同)

sbl*_*ndy 67

在Java Service Wrapper上运气不错

  • Java Service Wrapper看起来非常有用.但我看了一下功能列表.您只需要知道社区版本未获得在服务器上使用的许可. (11认同)
  • http://wrapper.tanukisoftware.org/doc/english/licenseCommunity.html封闭源使用GPL并不限制私有软件被开发用于内部使用,这取决于GPL下的软件,只要该软件永远不会分发而不制作所有用户都可以使用整个应用程序的完整源代码.虽然我们鼓励公司和政府用户使用服务器或开发许可协议,但只要该应用程序供内部使用,或者将始终与其完整的src一起分发,社区许可协议是可接受的. (7认同)

111*_*01b 56

使用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可执行文件以嵌入您自己的自定义图标,如下所示:

    > RCEDIT.exe /I MyServiceName.exe customIcon.ico
    > RCEDIT.exe /I MyServiceNamew.exe customTrayIcon.ico
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)
  5. 现在你有一个Jar的Windows服务,它将使用你自己的图标和名称运行!您还可以启动监视文件,它将使用您自己的图标和名称在系统托盘中运行.

  • 您知道,您不能在服务名称中包含空格. (2认同)

Gio*_*tro 29

一个简单的方法是NSSM Wrapper Wrapper(参见我的博客文章).

  • NSSM ROCKS!我甚至可以从我的java程序中创建包装器.简单,轻便,工作 - 100kb的幸福!谢谢! (7认同)
  • 与Apache Commons Daemon,wrapper.tanukisoftware.org和yajsw相比,NSSM是将简单的Java应用程序转换为Windows服务的最快,最简单的选择 (2认同)

Pet*_*ith 26

另一个选择是WinRun4J.这是一个可配置的java启动程序,可兼作Windows服务主机(32位和64位版本).它是开源的,对其使用没有限制.

(完全披露:我在这个项目上工作).

  • 谢谢你.我已经尝试过YAJWS,首先它以19mb的下载让我感到害怕,在我按照说明后显示"错误解析命令行".我看过PROCRUN,这对于快速设置来说太麻烦了.INSTSRV/SRVANY需要注册表更改!Launch4J在EXE中包含一个JAR,因此它使部署变得复杂.WinRun4J非常适合.唯一的缺点是它需要一个特殊的类作为服务(而不是简单地调用标准主类).但总体而言,这是完美的99%. (3认同)
  • 仅供参考,最新版本有标准主类的包装. (2认同)

ato*_*les 17

另一个答案是Yet Another Service Service Wrapper,这似乎是Java Service Wrapper的一个很好的替代品,因为它有更好的许可.它也很容易从JSW转移到YAJSW.当然,对于我来说,Windows服务器是全新的,并且试图将Java应用程序作为服务运行,它非常容易使用.

我找到的其他一些,但最终没有使用:

  • Java Service Launcher我没有使用它,因为看起来比YAJSW更复杂.我不认为这是一个包装.
  • JSmooth Creating Window的服务不是它的主要目标,但可以做到.我没有使用它,因为自2007年以来一直没有活动.


Ed *_*mas 6

我认为Java Service Wrapper运行良好.请注意,有三种方法可以集成您的应用程序.听起来选项1最适合您,因为您不想更改代码.配置文件可能会有点疯狂,但请记住(对于选项1)您正在启动的程序以及您将为其指定参数的程序是他们的帮助程序,然后它将启动您的程序.他们有一个示例配置文件.


Tho*_*sen 5

使用“ winsw ”,它是为 Glassfish v3 编写的,但通常适用于 Java 程序。

需要安装 .NET 运行时。


小智 5

如果您使用Gradle Build Tool,则可以尝试使用Windows-service-plugin,它有助于使用Apache Commons Daemon Procrun

要使用插件创建Java Windows Service应用程序,您需要执行几个简单的步骤。

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

    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
            }
        }
    
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将插件包含到您的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"
    
    Run Code Online (Sandbox Code Playgroud)

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

    plugins {
      id "com.github.alexeylisyutenko.windows-service-plugin" version "1.1.0"
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 配置插件。

    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'
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 运行createWindowsService gradle任务以创建Windows服务分发。

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

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

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

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