我刚刚继承了一个java应用程序,需要在XP和vista上作为服务安装。我已经8年没有使用任何形式的windows了,我从来没有创建过服务,更不用说从java应用程序(我已经为应用程序准备了一个jar和一个依赖jar - log4j)。使其作为服务运行所必需的魔力是什么?我已经得到了源代码,所以代码修改(尽管最好避免)是可能的。
当前回答
一种简单的方法是使用NSSM Wrapper Wrapper(请参阅我的博客文章)。
其他回答
我总是只使用sc.exe(参见http://support.microsoft.com/kb/251192)。它应该安装在从SP1开始的XP上,如果它不符合你的Vista风格,你可以通过Vista资源包下载加载它。
我没有使用Java做过太复杂的事情,但是使用完全限定的命令行参数(x:\ Java .exe ....)或使用Ant创建一个脚本来包含依赖项和设置参数对我来说都很好。
另一种选择是WinRun4J。这是一个可配置的java启动器,可作为windows服务主机(32位和64位版本)。它是开源的,使用上没有限制。
(完全披露:我参与了这个项目)。
这很简单,因为你必须加入快捷方式
Windows 7 C:\users\所有用户\开始菜单\程序\启动(Admin)或用户主目录(%userProfile%)
Windows 10: 在“Run 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。战争,但即使这样,你会得到超时,但在后台java.exe将启动。检入任务管理器
注意:这将在windows登录启动时运行(在登录之前,基于服务“启动类型”)
创建windows服务的详细说明
在过去几年里,我一直在使用jar2exe在Windows上运行我们的Java应用程序作为服务。它提供了一个选项来创建一个exe文件,可以作为Windows服务安装。
通过结合使用外部内存和连接器API(从JDK16开始预览)与OpenJDK jextract项目来处理Windows服务的回调,然后使用jpackage来生成一个Windows EXE,然后可以注册为Windows服务,这是可能在100% Java代码中实现Windows服务。
请看这个例子,它概述了实现Windows服务所需的工作。所有Windows服务EXE必须为主入口点ServiceMain和服务控制处理程序提供回调,并在Advapi.DLL中使用API调用StartServiceCtrlDispatcherW, RegisterServiceCtrlHandlerExW和SetServiceStatus。
在具有外部内存结构的Java中,上述回调的流程是:
main()
Must register ServiceMain using StartServiceCtrlDispatcherW
Above call blocks until ServiceMain exits
void ServiceMain(int dwNumServicesArgs, MemoryAddress lpServiceArgVectors)
Must register SvcCtrlHandler using RegisterServiceCtrlHandlerExW
Use SetServiceStatus(SERVICE_START_PENDING)
Initialise app
Use SetServiceStatus(SERVICE_RUNNING)
wait for app shutdown notification
Use SetServiceStatus(SERVICE_STOPPED)
int SvcCtrlHandler(int dwControl, int dwEventType, MemoryAddress lpEventData, MemoryAddress lpContext)
Must respond to service control events and report back using SetServiceStatus
On receiving SERVICE_CONTROL_STOP reports SetServiceStatus(SERVICE_STOP_PENDING)
then set app shutdown notification
一旦完成Java应用程序,jpackage可以创建运行时+EXE,然后可以安装和注册为Windows服务。以管理员身份运行(=后面的空格很重要):
sc create YourJavaServiceName type= own binpath= "c:\Program Files\Your Release Dir\yourjavaservice.exe"
推荐文章
- Java 8接口方法中不允许“同步”的原因是什么?
- 如何找到Java堆大小和内存使用(Linux)?
- 使用Enum实现单例(Java)
- RabbitMQ与通道和连接之间的关系
- buildSessionFactory()配置方法在Hibernate中已弃用?
- Spring MVC -如何获得所有的请求参数在一个地图在Spring控制器?
- 如何在Java中按两个字段排序?
- 文件之间的差异。路径中的分隔符和斜杠
- 在方法参数中使用NotNull注释
- Spring MVC中处理可选参数的@RequestParam
- Tomcat:如何查找正在运行的Tomcat版本?
- “java”、“javaw”和“javaws”之间有什么区别?
- 将Date对象转换为日历对象
- 在Java中保存最后N个元素的大小有限的队列
- 如何运行一个类从Jar不是主类在其清单文件