1

我见过很多人问如何使 java 应用程序成为服务,而答案总是包装器(即 JSW)。

我想知道是什么让 java 应用程序变成了服务,以及如何在没有包装器的情况下实现它。

我并不是要重新发明轮子,只是让我觉得“更弱”不处理这个问题背后的概念。

4

4 回答 4

2

Windows 不是 Lunix。Linux 服务只是一个 shell 脚本,它实现了启动、停止、重启等选项。Windows 服务是实现良好定义接口的本机组件。JVM 没有实现这样的接口,所以你需要一些东西来实现它并运行 java。

有几个这样的组件。我知道 JavaService 和 Apache Daemon,建议你使用它们。我不相信有什么“较弱”的东西,我不认为提到的解决方案太重。JavaService 只是一个小 DLL。

于 2013-02-26T22:25:48.990 回答
1

看看https://en.wikipedia.org/wiki/Service_wrapper

“Java 本身不支持创建系统服务”

于 2013-02-26T22:25:12.623 回答
0

如果您想知道为什么需要这些包装器,可以查看它们的源代码(其中一些是开源的)。

通常用于运行应用程序 (java.exejavaw.exe) 的可执行文件无法处理运行服务所需的信号。特别是,虽然启动应用程序很容易,但通知服务应用程序需要停止并重新启动是另一回事。您需要在应用程序运行时捕获这些通知,如果这不是突然的进程终止,那肯定会更好。

除了服务的注册方面,服务包装器还实现了一些 JNI 功能,以使您的应用程序知道它是一个服务。(据我所知,他们也倾向于使用 JVM DLL 而不是可执行文件。)

Winrun4J 代码为例。它具有本机部分和 Java 部分。

此外,服务还需要注意某些技巧。例如,如果您不使用-Xrs,您的服务将在用户注销时关闭

于 2013-02-26T22:49:21.760 回答
0

Java 不会编译为本机可执行文件(用于 !indows 或 Linux elf 可执行文件的 .exe 文件)。执行 Java 类的唯一方式是在 Java 虚拟机中,这就是您java -cp Main在启动 Java 应用程序时键入的原因。这也是为什么 Java 二进制文件可以在多个平台上执行的原因,无论哪个平台创建了类和 jar 文件。

服务只是操作系统在某个时间点(例如在启动时)启动的可执行文件。创建此类服务与 Java 完全不同,因为它们是操作系统的问题。如果您想了解有关服务的更多信息,我建议您在相关网站上查找“服务”(或您正在使用的平台调用它们的任何内容)的创建。您甚至可以查看现有包装库的源代码以了解详细信息,但您将不可避免地不得不使用Java 以外的语言来为您的操作系统实现服务。

使用现有的包装库来避免至少在其他语言中进行本机编码没有任何弱点。正如你所说,不要重新发明轮子。

于 2013-02-26T22:29:21.923 回答