Java 如何在跨平台服务中使用Apache Commons守护程序?

Java 如何在跨平台服务中使用Apache Commons守护程序?,java,service,daemon,executable-jar,apache-commons-daemon,Java,Service,Daemon,Executable Jar,Apache Commons Daemon,我有一个Java守护进程(运行24/7/365的系统服务),需要作为可执行JAR部署,但是我希望用户(在Windows、Linux和Mac上)能够通过以下方式启动/停止应用程序: service myapp start service myapp stop (或Windows/Mac服务的同等服务)。显然,这需要操作系统级别的东西将myapp“服务”映射到Java应用程序内部的特定方法调用(可能分别是LifecycleManager#start()和LifecycleManager#stop

我有一个Java守护进程(运行24/7/365的系统服务),需要作为可执行JAR部署,但是我希望用户(在Windows、Linux和Mac上)能够通过以下方式启动/停止应用程序:

service myapp start

service myapp stop
(或Windows/Mac服务的同等服务)。显然,这需要操作系统级别的东西将
myapp
“服务”映射到Java应用程序内部的特定方法调用(可能分别是
LifecycleManager#start()
LifecycleManager#stop()

我听说它可以用于此目的,在仔细阅读他们的网站后,它看起来就是这样做的。然而,它看起来像是一个老项目,实际上没有任何文档来完成我正在寻找的东西


所以我问:
commons-daemon
能做我需要的事情吗,或者我需要其他的东西还是额外的东西?如何从可执行JAR中获取跨平台守护程序?提前谢谢

是的,Apache Commons守护程序可以在Windows上作为服务(使用ProCurn)或在*NIX上作为守护程序(使用JSVC)运行jar。我只在Windows上使用它,所以其余的只适用于ProCurn:

ProRun支持正确关闭Windows服务(它可以在正在运行的应用程序中调用stop方法)。它还有一点额外的功能,比如有选择地将stdout和stderr重定向到单独的日志文件,并直接运行服务包装器exe(假设您将其重命名为服务名称),运行非服务模式控制台,让您立即看到输出。您可能想使用procrun的“jvm模式”。请阅读中有关如何执行此操作的详细信息


如果您需要其他更高级的功能,例如如果服务需要能够自行重新启动,那么请看一看(另一个Java服务包装器)。总体而言,YAJSW可能更好,但我还没有尝试过。

如果你只是想要启动/停止功能,你所需要的只是让你的应用程序优雅地处理SIGTERM。尝试阅读一些其他的服务脚本,看看它们是如何工作的。谢谢@BaileyS(+1)-您是否有任何特定于Java的想法(文章、教程等)?另外,对你在这里的措辞感到好奇:“如果你只是想启动/停止功能…”?这不是
commons守护进程所做的吗(将您的Java JAR映射到服务启动/停止调用?或者
commons daemon
是否也做其他事情?如果是,请举例说明?再次感谢!老实说,我不知道commons daemon做什么。我的观点是,如果您只需要简单的启动/关闭脚本,那么您确实不需要特殊的库。处理关闭的方法是添加JVM关闭down hook.Startup很简单,只需调用java-jar daemon.jar…通常unix操作系统会有一个空白的服务脚本模板来帮助您创建自己的模板。祝您好运!如果您希望有一个服务脚本将消息传递给当前运行的实例,这将是一项更大的任务。如果您希望能够o传递信号以清除缓存而不重新启动。。。