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

时间:2008-09-16 00:06:35

标签: java windows-services

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

19 个答案:

答案 0 :(得分:94)

Apache Commons Daemon是一个不错的选择。它具有Procrun用于Windows服务,Jsvc用于unix守护进程。它使用限制较少的Apache许可证,Apache Tomcat将其作为自身的一部分在Windows和Linux上运行!要使它工作有点棘手,但有一个exhaustive article的工作示例。

除此之外,您可以查看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()”会导致错误。如果您无法修改这些调用,请考虑制作一个可以按摩这些调用以满足您需求的引导程序类。

答案 1 :(得分:65)

我对the Java Service Wrapper

运气不错

答案 2 :(得分:53)

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

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

  1. 下载Apache Commons Daemon binaries(您需要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
    
  4. 现在安装这样的Windows服务(有关详细信息和选项,请参阅documentation):

    > 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服务将使用您自己的图标和名称运行!您也可以启动监视文件,它将在系统托盘中运行,并带有您自己的图标和名称。

答案 3 :(得分:25)

一种简单的方法是NSSM Wrapper包装器(see my blog entry)。

答案 4 :(得分:25)

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

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

答案 5 :(得分:17)

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

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

  • Java Service Launcher我没有使用它,因为看起来比YAJSW更复杂。我不认为这是一个包装。
  • JSmooth创建Window的服务不是它的主要目标,而是can be done。我没有使用它,因为自2007年以来一直没有活动。

答案 6 :(得分:6)

我认为Java Service Wrapper效果很好。请注意,three ways可以集成您的应用程序。听起来选项1最适合您,因为您不想更改代码。配置文件可能会有点疯狂,但请记住(对于选项1)您正在启动的程序以及您将为其指定参数的程序是他们的帮助程序,然后它将启动您的程序。他们有example configuration file

答案 7 :(得分:4)

使用Java 8,我们可以在没有任何外部工具的情况下处理这种情况。随Java 8提供的javapackager工具提供了创建自包含应用程序包的选项:

- 原型 生成自包含的应用程序包(如果可能)。使用-B选项为正在使用的程序包提供参数。如果指定了type,则只创建此类型的bundle。如果未指定类型,则使用all。

以下值适用于类型:

-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,请参考以下doc,我们可以根据需要创建msi或exe。

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

答案 8 :(得分:4)

JavaService是LGPL。它非常容易和稳定。强烈推荐。

答案 9 :(得分:3)

使用为Glassfish v3编写的“winsw”,但一般适用于Java程序。

要求安装.NET运行时。

答案 10 :(得分:3)

如果您使用Gradle Build Tool,可以尝试我的windows-service-plugin,这有助于Apache Commons Daemon Procrun的使用。

要使用该插件创建Java Windows服务应用程序,您需要完成几个简单的步骤。

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

    var audioPlayer : AVAudioPlayer?
    
    func playSound()
    {
        let fileURL = Bundle.main.path(forResource: "beep-01a", ofType:"mp3")!
    
        let url = URL(fileURLWithPath: fileURL)
    
        do
        {
            let player = try AVAudioPlayer(contentsOf: url)
            self.audioPlayer = player
            player.prepareToPlay()
            player.play()
        }
        catch let error as NSError
        {
            print(error.description)
        }
    }
    
  2. 将插件包含在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

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

    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"
    
  3. 配置插件。

    plugins {
      id "com.github.alexeylisyutenko.windows-service-plugin" version "1.1.0"
    }
    
  4. 运行 createWindowsService gradle任务以创建Windows服务分发。

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

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

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

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

答案 11 :(得分:2)

可以在以下位置找到不同解决方案的相当好的比较: http://yajsw.sourceforge.net/#mozTocId284533

个人喜欢launch4j

答案 12 :(得分:2)

我总是使用sc.exe(参见http://support.microsoft.com/kb/251192)。它应该从SP1安装在XP上,如果它不是你喜欢的Vista,你可以使用Vista资源包下载它。

我没有做过任何过于复杂的Java,但使用完全限定的命令行参数(x:\ java.exe ....)或使用Ant创建脚本以包含依赖项和设置参数的工作正常我

答案 13 :(得分:2)

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

我考虑过用C#编写服务,但我的时间限制太紧了。

答案 14 :(得分:2)

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

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

Windows 10: 在运行shell:startup

在其中的属性 - &gt;快捷方式 - &gt;目标 - &gt; java.exe -jar D:\..\runJar.jar

注意:只有在您登录后才能运行

使用管理员权限

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

如果你超时使用cmd /c D:\JAVA7~1\jdk1.7.0_51\bin\java.exe -jar d:\jenkins\jenkins.war,但即使这样你也会超时,但在后台启动java.exe。签入任务管理器

注意:这将在Windows登录启动时运行(登录前,基于服务&#39; Startup Type&#39;)

Detailed explanation of creating windows service

答案 15 :(得分:2)

我之前使用JavaService取得了很好的成功。它在几年内没有更新,但在我使用它的时候还是很坚固。

答案 16 :(得分:1)

我目前要求它运行基于Eclipse的应用程序,但我需要先设置一些本地应用程序的变量。 sc.exe只允许可执行文件而不允许脚本,所以我转向autoexnt.exe,它是Windows 2003 resource kit的一部分。它将服务限制为单个批处理文件,但我只需要将一个批处理脚本转换为服务。

侨!

答案 17 :(得分:1)

另一个不错的选择是FireDaemon。它被NASA,IBM等大型商店使用;请访问他们的网站以获取完整列表。

答案 18 :(得分:-1)

Exe4j是一个非常好的选择,虽然它不是免费的。在Exe4j处查看它在向导中创建.exe文件,您可以选择创建服务。