232

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

4

19 回答 19

107

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 时遇到了一些困难,您的启动和停止方法必须接受参数 (String[] argv)。例如“start(String[] argv)”和“stop(String[] argv)”会起作用,但“start()”和“stop()”会导致错误。如果您无法修改这些调用,请考虑制作一个引导程序类,该类可以按摩这些调用以满足您的需求。

于 2010-03-25T18:02:02.067 回答
73

对 Java Service Wrapper很幸运

于 2008-09-16T00:11:11.727 回答
65

使用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 服务(有关更多详细信息和选项,请参阅文档):

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

    > MyServiceNamew.exe //MS//MyServiceName
    
于 2012-05-25T14:45:15.130 回答
31

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

于 2013-01-28T00:07:21.180 回答
27

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

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

于 2009-05-11T07:50:53.723 回答
18

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

我发现了其他一些,但最终没有使用:

  • Java Service Launcher我没有使用它,因为它看起来比 YAJSW 更复杂。我不认为这是一个包装。
  • JSmooth创建 Window 的服务不是它的主要目标,但可以做到。我没有使用它,因为自 2007 年以来没有任何活动。
于 2010-09-02T11:02:18.097 回答
8

如果你使用 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 的信息。

于 2017-08-01T16:33:19.930 回答
6

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

于 2008-09-16T02:34:49.947 回答
5

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

需要安装 .NET 运行时。

于 2011-05-10T18:03:04.203 回答
4

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

于 2009-10-12T08:51:49.800 回答
3

不同解决方案的一个很好的比较可以在:http: //yajsw.sourceforge.net/#mozTocId284533

个人喜欢launch4j

于 2010-12-30T02:38:35.777 回答
3

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

-native type 生成独立的应用程序包(如果可能)。使用 -B 选项为正在使用的捆绑程序提供参数。如果指定了类型,则仅创建此类型的捆绑包。如果未指定类型,则使用 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,请参阅以下文档,我们可以根据需要创建 msi 或 exe。

exe: Generates a Windows .exe package.
msi: Generates a Windows Installer package.
于 2017-08-24T01:57:45.047 回答
2

我以前使用过JavaService并取得了很好的成功。它已经有几年没有更新了,但是当我使用它时,它已经非常坚如磐石了。

于 2008-09-16T02:20:33.537 回答
2

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

我想过用 C# 写一个服务,但是我的时间太紧了。

于 2008-09-16T02:27:05.580 回答
2

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

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

于 2008-09-16T02:34:18.263 回答
2

这很简单,因为您必须输入快捷方式

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

Windows 10: 运行中 shell:startup

在它的属性->快捷方式->目标->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 登录启动时运行(登录前,基于服务' Startup Type')

创建windows服务详解

于 2017-02-13T12:29:31.490 回答
1

另一个不错的选择是FireDaemon。它被 NASA、IBM 等一些大商店使用;查看他们的网站以获取完整列表。

于 2008-09-16T06:40:59.463 回答
1

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

再见!

于 2008-09-23T00:26:54.570 回答
1

过去几年我一直在使用jar2exe在 Windows 上将我们的 Java 应用程序作为服务运行。它提供了一个选项来创建一个可以作为 Windows 服务安装的 exe 文件。

于 2021-08-22T02:49:52.550 回答