我刚刚继承了一个java应用程序,需要在XP和vista上作为服务安装。我已经8年没有使用任何形式的windows了,我从来没有创建过服务,更不用说从java应用程序(我已经为应用程序准备了一个jar和一个依赖jar - log4j)。使其作为服务运行所必需的魔力是什么?我已经得到了源代码,所以代码修改(尽管最好避免)是可能的。
当前回答
我以前用过JavaService,而且很成功。它已经有几年没有更新了,但当我使用它的时候,它非常坚固。
其他回答
Apache Commons Daemon是一个很好的替代方案。它为windows服务提供Procrun,为unix守护进程提供Jsvc。它使用限制较少的Apache许可证,Apache Tomcat将其作为自身的一部分运行在Windows和Linux上!要让它工作起来有点棘手,但是有一篇详细的文章提供了工作示例。
除此之外,您可以查看Apache Tomcat中的bin\service.bat以了解如何设置服务。在Tomcat中,他们重命名Procrun二进制文件(prunsrv.exe -> tomcat6.exe, prunmgr.exe -> tomcat6w.exe)。
我在使用Procrun时遇到了一些困难,您的启动和停止方法必须接受参数(String[] argv)。例如"start(String[] argv)"和"stop(String[] argv)"可以工作,但"start()"和"stop()"会导致错误。如果您不能修改这些调用,请考虑创建一个bootstrapper类,它可以根据您的需要修改这些调用。
以下是不同解决方案的比较: http://yajsw.sourceforge.net/#mozTocId284533
个人喜欢launch4j
如果你使用Gradle构建工具,你可以试试我的windows-service-plugin,它可以方便地使用Apache Commons Daemon Procrun。
要用这个插件创建一个java windows服务应用程序,你需要经过几个简单的步骤。
Create a main service class with the appropriate method. 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 } } } Include the plugin into your build.gradle file. 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" The same script snippet for new, incubating, plugin mechanism introduced in Gradle 2.1: plugins { id "com.github.alexeylisyutenko.windows-service-plugin" version "1.1.0" } Configure the plugin. 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' } Run createWindowsService gradle task to create a windows service distribution.
这就是创建一个简单的windows服务所需要做的全部工作。该插件将自动下载Apache Commons Daemon Procrun二进制文件,将这些二进制文件解压缩到服务分发目录,并创建批处理文件用于安装/卸载服务。
在${项目。在buildDir}/windows-service目录下,你会找到服务的可执行文件,用于安装/卸载服务的批处理脚本和所有运行时库。 安装服务请执行<project-name>-install.bat,卸载服务请执行<project-name>-uninstall.bat。 要启动和停止服务,请使用<project-name>w.exe可执行文件。
注意,方法处理服务启动应该创建并启动一个单独的线程来执行处理,然后返回。当您启动和停止服务时,从不同的线程调用main方法。
更多信息,请阅读插件和Apache Commons Daemon Procrun。
我不喜欢Java服务包装器的授权。我使用ActiveState Perl编写了一个完成这项工作的服务。
我想过用c#写一个服务,但是我的时间太紧了。
我以前用过JavaService,而且很成功。它已经有几年没有更新了,但当我使用它的时候,它非常坚固。
推荐文章
- 为什么MongoDB Java驱动在条件中使用随机数生成器?
- 即使从未抛出异常,使用try-catch块的代价是否昂贵?
- 什么时候我们应该使用观察者和可观察对象?
- Java中的split()方法对点(.)不起作用。
- Eclipse调试器总是阻塞在ThreadPoolExecutor上,没有任何明显的异常,为什么?
- Java生成两个给定值之间的随机数
- 如何有效地从数组列表或字符串数组中删除所有空元素?
- 比较JUnit断言中的数组,简洁的内置方式?
- codestyle;把javadoc放在注释之前还是之后?
- 如何在Spring中定义List bean ?
- 将Set<T>转换为List<T>的最简洁的方法
- 在JavaScript中,什么相当于Java的Thread.sleep() ?
- 使用Java重命名文件
- URL从Java中的类路径加载资源
- .toArray(new MyClass[0]) or .toArray(new MyClass[myList.size()])?