如何使用jpackage将程序添加到开机自启并实现安装后自动运行?
jpackage实现开机自启+安装后自动启动的两种方案
方案1:jpackage原生+自定义安装脚本(无需修改应用代码)
安装后自动启动实现
jpackage Windows平台原生提供--win-run-on-install参数,直接添加到打包命令即可实现安装完成后自动运行程序,无需额外开发。
开机自启实现
jpackage没有直接的开机自启参数,可通过自定义安装脚本添加注册表启动项实现:
- 新建
add-startup.bat脚本,和打包命令执行路径放在同一目录,内容如下:
@echo off :: 给当前用户添加开机自启,不需要管理员权限 reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /v "Sample-Javafx" /t REG_SZ /d "%~dp0Sample-Javafx.exe" /f :: 如果需要给所有用户添加自启,替换上面的HKCU为HKLM,需要安装时以管理员权限运行安装包
- 修改jpackage打包命令,添加自定义脚本参数:
jpackage --win-dir-chooser --runtime-image ./target/image/ --name Sample-Javafx --module Sample/org.openjfx.App -d ./target/bin/ --win-run-on-install --win-custom-action add-startup.bat
方案2:应用内部代码实现
如果不想添加自定义脚本,可以在应用启动时自动检查并注册开机自启,修改App.java即可:
完整修改后的App.java代码
package org.openjfx; import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.Label; import javafx.scene.layout.StackPane; import javafx.stage.Stage; import java.io.File; import java.nio.file.Paths; /** * JavaFX App */ public class App extends Application { private static void registerStartup() { try { // 获取当前程序所在目录 String appDir = new File(App.class.getProtectionDomain().getCodeSource().getLocation().toURI()).getParent(); String exeFullPath = Paths.get(appDir, "Sample-Javafx.exe").toString(); // 检查是否已经注册过自启 Process checkProcess = new ProcessBuilder("reg", "query", "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run", "/v", "Sample-Javafx").start(); if (checkProcess.waitFor() != 0) { // 未注册则添加启动项 new ProcessBuilder("reg", "add", "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run", "/v", "Sample-Javafx", "/t", "REG_SZ", "/d", exeFullPath, "/f").start(); } } catch (Exception ignored) { // 注册失败不影响主程序运行,可根据需要添加日志 } } @Override public void start(Stage stage) { var label = new Label("Hello, JavaFX"); var scene = new Scene(new StackPane(label), 640, 480); stage.setScene(scene); stage.show(); } public static void main(String[] args) { registerStartup(); launch(); } }
说明
- 代码中使用当前用户注册表路径
HKCU,无需管理员权限即可注册 - 如果需要用户可自主控制是否开启自启,可在界面中增加开关,调整上述注册逻辑即可
内容的提问来源于stack exchange,提问作者srilakshmikanthanp
相关产品推荐
相关产品推荐

