我刚刚继承了一个需要在XP和Vista上作为服务安装的java应用程序。自从我以任何形式使用Windows以来已经过去了大约8年,我从来没有创建过服务,更不用说像java应用程序这样的东西(我有一个应用程序jar和一个依赖jar - log4j )。将此作为服务运行所需的魔力是什么?我有源代码,因此可以进行代码修改,但最好避免使用。
答案 0 :(得分:94)
Apache Commons Daemon是一个不错的选择。它具有Procrun用于Windows服务,Jsvc用于unix守护进程。它使用限制较少的Apache许可证,Apache Tomcat将其作为自身的一部分在Windows和Linux上运行!要使它工作有点棘手,但有一个exhaustive article的工作示例。
除此之外,您可以查看Apache Tomcat中的bin \ service.bat以了解如何设置服务。在Tomcat中,他们重命名Procrun二进制文件(prunsrv.exe - > tomcat6.exe,prunmgr.exe - > tomcat6w.exe)。
我在使用Procrun时遇到了困难,你的start和stop方法必须接受参数(String [] argv)。例如“start(String [] argv)”和“stop(String [] argv)”可以工作,但“start()”和“stop()”会导致错误。如果您无法修改这些调用,请考虑制作一个可以按摩这些调用以满足您需求的引导程序类。
答案 1 :(得分:65)
答案 2 :(得分:53)
使用Apache Commons Daemon,您现在可以拥有自定义的可执行文件名称和图标了!您还可以使用自己的名称和图标获取自定义Windows托盘监视器!
我现在使用自己的名称和图标(prunsrv.exe)运行我的服务,系统托盘监视器(prunmgr.exe)也有我自己的自定义名称和图标!
MyServiceName.exe
和MyServiceNamew.exe
。下载WinRun4J并使用随附的RCEDIT.exe
程序修改Apache可执行文件,以嵌入您自己的自定义图标,如下所示:
> RCEDIT.exe /I MyServiceName.exe customIcon.ico
> RCEDIT.exe /I MyServiceNamew.exe customTrayIcon.ico
现在安装这样的Windows服务(有关详细信息和选项,请参阅documentation):
> MyServiceName.exe //IS//MyServiceName \
--Install="C:\path-to\MyServiceName.exe" \
--Jvm=auto --Startup=auto --StartMode=jvm \
--Classpath="C:\path-to\MyJarWithClassWithMainMethod.jar" \
--StartClass=com.mydomain.MyClassWithMainMethod
现在,您的Jar的Windows服务将使用您自己的图标和名称运行!您也可以启动监视文件,它将在系统托盘中运行,并带有您自己的图标和名称。
答案 3 :(得分:25)
一种简单的方法是NSSM Wrapper包装器(see my blog entry)。
答案 4 :(得分:25)
另一个选项是WinRun4J。这是一个可配置的java启动程序,可兼作Windows服务主机(32位和64位版本)。它是开源的,对其使用没有限制。
(完全披露:我在这个项目上工作)。
答案 5 :(得分:17)
另一个答案是Yet Another Java Service Wrapper,这似乎是Java Service Wrapper的一个很好的替代品,因为它具有更好的许可。它也很容易从JSW转移到YAJSW。当然,对于我来说,Windows服务器是全新的,并且试图将Java应用程序作为服务运行,它非常容易使用。
我找到的其他一些人,但最终没有使用:
答案 6 :(得分:6)
我认为Java Service Wrapper效果很好。请注意,three ways可以集成您的应用程序。听起来选项1最适合您,因为您不想更改代码。配置文件可能会有点疯狂,但请记住(对于选项1)您正在启动的程序以及您将为其指定参数的程序是他们的帮助程序,然后它将启动您的程序。他们有example configuration file。
答案 7 :(得分:4)
使用Java 8,我们可以在没有任何外部工具的情况下处理这种情况。随Java 8提供的javapackager工具提供了创建自包含应用程序包的选项:
- 原型 生成自包含的应用程序包(如果可能)。使用-B选项为正在使用的程序包提供参数。如果指定了type,则只创建此类型的bundle。如果未指定类型,则使用all。
以下值适用于类型:
-native type
Generate self-contained application bundles (if possible). Use the -B option to provide arguments to the bundlers being used. If type is specified, then only a bundle of this type is created. If no type is specified, all is used.
The following values are valid for type:
all: Runs all of the installers for the platform on which it is running, and creates a disk image for the application. This value is used if type is not specified.
installer: Runs all of the installers for the platform on which it is running.
image: Creates a disk image for the application. On OS X, the image is the .app file. On Linux, the image is the directory that gets installed.
dmg: Generates a DMG file for OS X.
pkg: Generates a .pkg package for OS X.
mac.appStore: Generates a package for the Mac App Store.
rpm: Generates an RPM package for Linux.
deb: Generates a Debian package for Linux.
如果是windows,请参考以下doc,我们可以根据需要创建msi或exe。
exe: Generates a Windows .exe package.
msi: Generates a Windows Installer package.
答案 8 :(得分:4)
JavaService是LGPL。它非常容易和稳定。强烈推荐。
答案 9 :(得分:3)
使用为Glassfish v3编写的“winsw”,但一般适用于Java程序。
要求安装.NET运行时。
答案 10 :(得分:3)
如果您使用Gradle Build Tool,可以尝试我的windows-service-plugin,这有助于Apache Commons Daemon Procrun的使用。
要使用该插件创建Java Windows服务应用程序,您需要完成几个简单的步骤。
使用适当的方法创建主服务类。
var audioPlayer : AVAudioPlayer?
func playSound()
{
let fileURL = Bundle.main.path(forResource: "beep-01a", ofType:"mp3")!
let url = URL(fileURLWithPath: fileURL)
do
{
let player = try AVAudioPlayer(contentsOf: url)
self.audioPlayer = player
player.prepareToPlay()
player.play()
}
catch let error as NSError
{
print(error.description)
}
}
将插件包含在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
}
}
}
文件中。
build.gradle
Gradle 2.1中引入的新的孵化,插件机制的相同脚本片段:
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"
配置插件。
plugins {
id "com.github.alexeylisyutenko.windows-service-plugin" version "1.1.0"
}
运行 createWindowsService gradle任务以创建Windows服务分发。
您需要做的就是创建一个简单的Windows服务。该插件将自动下载Apache Commons Daemon Procrun二进制文件,将此二进制文件解压缩到服务分发目录,并创建批处理文件以安装/卸载该服务。
在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'
}
目录中,您将找到服务可执行文件,用于安装/卸载服务的批处理脚本以及所有运行时库。
要安装服务运行${project.buildDir}/windows-service
,并且要卸载服务运行<project-name>-install.bat
。
要启动和停止服务,请使用<project-name>-uninstall.bat
可执行文件。
请注意,方法处理服务启动时应创建并启动一个单独的线程来执行处理,然后返回。当您启动和停止服务时,将从不同的线程调用main方法。
有关更多信息,请阅读插件和Apache Commons Daemon Procrun。
答案 11 :(得分:2)
可以在以下位置找到不同解决方案的相当好的比较: http://yajsw.sourceforge.net/#mozTocId284533
个人喜欢launch4j
答案 12 :(得分:2)
我总是使用sc.exe(参见http://support.microsoft.com/kb/251192)。它应该从SP1安装在XP上,如果它不是你喜欢的Vista,你可以使用Vista资源包下载它。
我没有做过任何过于复杂的Java,但使用完全限定的命令行参数(x:\ java.exe ....)或使用Ant创建脚本以包含依赖项和设置参数的工作正常我
答案 13 :(得分:2)
我不喜欢Java Service Wrapper的许可。我使用ActiveState Perl编写了一个完成工作的服务。
我考虑过用C#编写服务,但我的时间限制太紧了。
答案 14 :(得分:2)
这很简单,因为你必须把快捷方式放在
中 Windows 7
C:\users\All Users\Start Menu\Programs\Startup
(管理员)或User home directory(%userProfile%)
Windows 10:
在运行shell:startup
在其中的属性 - &gt;快捷方式 - &gt;目标 - &gt; 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.war
,但即使这样你也会超时,但在后台启动java.exe。签入任务管理器
注意:这将在Windows登录启动时运行(登录前,基于服务&#39; Startup Type
&#39;)
答案 15 :(得分:2)
我之前使用JavaService取得了很好的成功。它在几年内没有更新,但在我使用它的时候还是很坚固。
答案 16 :(得分:1)
我目前要求它运行基于Eclipse的应用程序,但我需要先设置一些本地应用程序的变量。 sc.exe只允许可执行文件而不允许脚本,所以我转向autoexnt.exe,它是Windows 2003 resource kit的一部分。它将服务限制为单个批处理文件,但我只需要将一个批处理脚本转换为服务。
侨!
答案 17 :(得分:1)
另一个不错的选择是FireDaemon。它被NASA,IBM等大型商店使用;请访问他们的网站以获取完整列表。
答案 18 :(得分:-1)
Exe4j是一个非常好的选择,虽然它不是免费的。在Exe4j处查看它在向导中创建.exe文件,您可以选择创建服务。