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

有帮助吗?

解决方案

我有一些运气 Java 服务包装器

其他提示

Apache 共享守护进程 是一个不错的选择。它有 普罗克伦 对于 Windows 服务,以及 JSVC 对于 UNIX 守护进程。它使用限制较少的 Apache 许可证,Apache Tomcat 使用它作为自身的一部分在 Windows 和 Linux 上运行!要让它工作有点棘手,但是有一个 详尽的文章 与工作示例。

除此之外,您可以查看 bin\service.bat 阿帕奇雄猫 了解如何设置该服务。在 Tomcat 中,它们重命名 Procrun 二进制文件(prunsrv.exe -> tomcat6.exe、prunmgr.exe -> tomcat6w.exe)。

我在使用 Procrun 时遇到了一些困难,您的启动和停止方法必须接受参数(String[] argv)。例如,“start(String[] argv)”和“stop(String[] argv)”可以工作,但“start()”和“stop()”会导致错误。如果您无法修改这些调用,请考虑创建一个引导程序类来处理这些调用以满足您的需求。

Apache 共享守护进程 您现在可以拥有自定义可执行文件名称和图标! 您还可以获得带有您自己的名字和图标的自定义 Windows 托盘监视器!

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

  1. 下载 Apache Commons 守护进程二进制文件 (您将需要 prunsrv.exe 和 prunmgr.exe)。
  2. 将它们重命名为 MyServiceName.exeMyServiceNamew.exe 分别。
  3. 下载 运行4J 并使用 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 服务,它将使用您自己的图标和名称运行!您还可以启动监视器文件,它将以您自己的图标和名称在系统托盘中运行。

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

(全面披露:我从事这个项目)。

一个简单的方法是 NSSM 包装器 包装纸(查看我的博客条目).

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

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

  • Java 服务启动器 我没有使用它,因为它看起来比 YAJSW 更复杂。我不认为这是一个包装器。
  • JSmooth 创建 Window 的服务不是其主要目标,而是 可以做到. 。我没有使用它,因为自 2007 年以来就没有任何活动。

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

Java服务 是LGPL。它非常简单且稳定。强烈推荐。

借助 Java 8,我们无需任何外部工具即可处理这种情况。 java打包器 java 8 附带的工具提供了创建自包含应用程序包的选项:

- 本质类型会生成独立的应用程序束(如果可能的话)。使用 -B 选项为正在使用的捆绑器提供参数。如果指定了类型,则仅创建该类型的捆绑包。如果未指定类型,则使用所有类型。

以下值对于类型有效:

-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.

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

需要安装 .NET 运行时。

如果你使用 Gradle Build Tool 你可以尝试我的 Windows 服务插件, ,这有利于使用 Apache Commons 守护进程 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. 跑步 创建Windows服务 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 的信息。

我用过 Java服务 之前取得了良好的成功。它已经有几年没有更新了,但当我使用它时,它非常坚固。

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

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

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

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

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

个人喜欢launch4j

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

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服务详解

另一个不错的选择是 火守护进程. 。它被一些大公司使用,如 NASA、IBM 等;请参阅他们的网站以获取完整列表。

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

再见!

Exe4j 是一个非常好的选择,尽管它不是免费的。检查一下: 执行程序4j 在创建 .exe 文件的向导中,您可以选择创建服务。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top