it-swarm.cn

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

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

206
ideasculptor

我有一些运气 Java Service Wrapper

65
sblundy

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

94
mcdon

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

53
11101101b

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

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

25
Peter Smith

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

25
Giordano Maestro

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

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

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

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

6
Ed Thomas

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

4
NT_

使用Java 8,我们无需任何外部工具即可处理此场景。 javapackager Java 8附带的工具提供了创建自包含应用程序包的选项:

-native type生成自包含的应用程序包(如果可能)。使用-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.
4
Steephen

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

需要安装.NET运行时。

3
Thorbjørn Ravn Andersen

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

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

  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
            }
        }
    
    }
    
  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"
    

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

    plugins {
      id "com.github.alexeylisyutenko.windows-service-plugin" version "1.1.0"
    }
    
  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'
    }
    
  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。

3
Alexey Lisyutenko

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

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

2
Hugh Buchanan

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

我没有做过任何太复杂的Java,但使用完全限定的命令行参数(x:\ Java.exe ....)或创建一个包含Ant的脚本以包含依赖项和设置参数对我来说很好。

2
Kevin

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

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

Windows 10: 在运行Shell:startup

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

注意:这只会在您登录后运行


使用Admin Right

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登录启动时运行(登录前,基于服务'Startup Type')

创建Windows服务的详细说明

2
Ravi Parekh

有关不同解决方案的相当不错的比较,请访问: http://yajsw.sourceforge.net/#mozTocId284533

个人喜欢launch4j

2
pushNpop

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

2
Jason

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

再见!

1
ramfree17

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

1
Andrew Swan