【发布时间】:2011-08-22 15:36:25
【问题描述】:
我有一个包含 Java 应用程序的 JAR 文件。如何让它从 Windows 启动,而不需要用户交互?
【问题讨论】:
我有一个包含 Java 应用程序的 JAR 文件。如何让它从 Windows 启动,而不需要用户交互?
【问题讨论】:
R) regedit
HKey local machine -> Software -> Microsoft -> Windows -> Current version -> run
Add -> String value
java
javaw -Xmx200m -jar C:\Path\to\jarfile\TheJar.jar
【讨论】:
如果您想通过 Java 以编程方式执行此操作,您可以直接写入 Windows 注册表启动文件夹。
Here 是如何以编程方式写入 Windows 注册表的链接。
当您实现了使用注册表的功能时,您只需运行此代码即可
String value = "\"javaw -jar " + System.getProperty("user.dir") + "\\myJar.jar\"";
WinRegistry.writeStringValue(WinRegistry.HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", "myJar autorun key", value);
key 的值需要是运行应用程序的命令,例如 java -jar myJar.jar
要从自动运行中删除它,您只需
WinRegistry.deleteValue(WinRegistry.HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", "myJar autorun key");
更新
Replace WinRegistry.writeStringValue with WinRegistry.setStringValue recent version of java 1.8.x
【讨论】:
这很简单,你必须把快捷方式放在
Windows 7
C:\users\All Users\Start Menu\Programs\Startup(管理员)或User home directory(%userProfile%)
Windows 10:
运行中shell:startup
在它的属性->快捷方式->目标->java.exe -jar D:\..\runJar.jar
注意:这只会在您登录后运行
拥有管理员权限
sc create serviceName binpath= "java.exe -jar D:\..\runJar.jar"会创建windows服务
如果你得到 timeout 使用cmd /c D:\JAVA7~1\jdk1.7.0_51\bin\java.exe -jar d:\jenkins\jenkins.war 但即使这样你也会得到超时但在后台 java.exe 将被启动。签入任务管理器
在一些受限的环境中,就像我在公司环境中一样
错误:
The service did not respond to the start or control request in a timely fashion
在这种情况下
cmd /c D:\JAVA7~1\jdk1.7.0_51\bin\java.exe -jar d:\jenkins\jenkins.war
如果您手动运行但会在后台运行,则会出现错误。
注意:这将在 Windows 登录启动时运行(登录前,基于服务 'Startup Type')
Detailed explanation of creating windows service
注册编辑
注意:仅限编辑高级用户
只为当前用户运行
HKEY_CURRENT_USER/SOFTWARE/MICROSOFT/WINDOWS/CURRENT_VERSION/RUN
为所有用户运行
hkey_local_machine/SOFTWARE/MICROSOFT/WINDOWS/CURRENT_VERSION/RUN
使用上面的命令创建一个带有名称和路径的字符串
【讨论】:
sc create 无法工作,因为 java.exe 没有实现 StartServiceCtrlDispatcher。见msdn.microsoft.com/en-us/library/windows/desktop/…
如果您还没有准备好自己进行配置,或者如果您想在多台计算机上使用相同的功能,那么您可以使用Advanced Installer。您可以打包要在 Windows 上安装的 jar,并设置将在启动时运行您的程序的参数
【讨论】:
为了从任何可执行文件创建服务,请使用Windows
Resource Kits 2003 中的srvany.exe(注意= 后面的空格)::
cmd> sc create NAME binPath= "c:\Program Files\Windows Resource Kits\Tools\srvany.exe" ^
type= own start= auto error= normal DisplayName= "NAME for services.msc"
然后传递srvany.exe wrapper 会做什么:
cmd> reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\NAME\Parameters" ^
/v "Application" ^
/d "\"c:\Program Files\Java\jre7\bin\java.exe\" -cp c:\home\devel\service Main"
您在上面看到了空格的引用语法。下次启动服务:
cmd> sc start NAME
如果您出错,请重新检查您的设置:
cmd> reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\NAME" /s
并删除服务:
cmd> sc delete NAME
然后再做一步。
访问 GUI services.msc 并检查 procexp.exe 服务实际启动。
另见:creating a service with sc.exe; how to pass in context parameters
注意所有涉及的工具都是微软官方!!!
【讨论】:
使用“winsw” - http://kenai.com/projects/winsw - 它是为 Glassfish v3 编写的,但通常适用于 Java 程序。
需要安装 .NET 运行时。
【讨论】:
创建一个 .bat 文件并将其放入:
javaw -Xmx200m -jar C:\Path\to\jarfile\TheJar.jar
然后将.bat文件放入windows启动文件夹中。
还有一点:使用 java 和 javaw 是有区别的。当您调试应用程序时,java 会更好,应用程序会打印文本或类似的东西,而当您不需要时,javaw 会更好。为什么?因为 java 使用显示所有应用程序打印(println、异常堆栈跟踪等)的控制台运行 java 程序,而 javaw 不在控制台上运行。
【讨论】:
this question 的答案可能适合您的需求。将您的 java 应用程序设置为作为 Windows 服务运行,您应该一切顺利。
【讨论】: