如何在没有包装器的情况下从java应用程序创建服务(windows)?

时间:2013-02-26 22:19:59

标签: java service wrapper

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

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

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

4 个答案:

答案 0 :(得分:2)

Windows不是Lunix。 Linux服务只是一个shell脚本,它实现了启动,停止,重启等选项。 Windows服务是一个本机组件,它实现了定义良好的接口。 JVM没有实现这样的接口,因此您需要执行此操作并运行java。

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

答案 1 :(得分:1)

查看http://en.wikipedia.org/wiki/Service_wrapper

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

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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

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

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

例如,请查看Winrun4J code。它有原生部分和Java部分。

此外,服务还需要了解某些技巧。例如,if you don't use -Xrs, your service will be shut down when the user logs off