我向来是不觉得通过脚本/命令行运行jar包有什么不好的,但想着使用jpackage生成相关程序也花不了多少工夫。
在不想大改代码的情况下,踩了不少坑。
也行吧。
本来还想试试通过Graalvm进行aot编译,还是不那么折腾了。
简介
- 先上官方文档
-
再上命令行用法
>jpackage --help 用法:jpackage <options> 示例用法: -------------- 生成适合主机系统的应用程序包: 对于模块化应用程序: jpackage -n name -p modulePath -m moduleName/className 对于非模块化应用程序: jpackage -i inputDir -n name \ --main-class className --main-jar myJar.jar 从预构建的应用程序映像: jpackage -n name --app-image appImageDir 生成应用程序映像: 对于模块化应用程序: jpackage --type app-image -n name -p modulePath \ -m moduleName/className 对于非模块化应用程序: jpackage --type app-image -i inputDir -n name \ --main-class className --main-jar myJar.jar 要为 jlink 提供您自己的选项,请单独运行 jlink: jlink --output appRuntimeImage -p modulePath \ --add-modules moduleName \ --no-header-files [<additional jlink options>...] jpackage --type app-image -n name \ -m moduleName/className --runtime-image appRuntimeImage 生成 Java 运行时程序包: jpackage -n name --runtime-image <runtime-image> 一般选项: @<filename> 从文件读取选项和/或模式 可以多次使用此选项。 --type -t <type> 要创建的程序包的类型 有效值为:{"app-image", "exe", "msi"} 如果未指定此选项,则将创建与平台相关的 默认类型。 --app-version <version> 应用程序和/或程序包的版本 --copyright <copyright string> 应用程序的版权 --description <description string> 应用程序的说明 --help -h 将用法文本输出到输出流并退出,用法文本中包含 适用于当前平台的每个有效选项的列表和说明 --icon <file path> 应用程序包图标的路径 (绝对路径或相对于当前目录的路径) --name -n <name> 应用程序和/或程序包的名称 --dest -d <destination path> 用来放置所生成的输出文件的路径 (绝对路径或相对于当前目录的路径) 默认为当前的工作目录。 --temp <directory path> 用来创建临时文件的新目录或空白目录的路径 (绝对路径或相对于当前目录的路径) 如果指定,则在任务完成时将不删除临时目录, 必须手动删除临时目录。 如果未指定,则将创建一个临时目录, 并在任务完成时删除该临时目录。 --vendor <vendor string> 应用程序的供应商 --verbose 启用详细的输出 --version 将产品版本输出到输出流并退出。 用来创建运行时映像的选项: --add-modules <模块名称>[,<模块名称>...] 要添加的模块的逗号 (",") 分隔列表 此模块列表连同主模块(如果指定) 将作为 --add-module 参数传递到 jlink。 如果未指定,则仅使用主模块(如果指定了 --module), 或者使用默认的模块集(如果指定了 --main-jar)。 可以多次使用此选项。 --module-path -p <module path>... 路径的 ; 分隔列表 每个路径要么是模块的目录,要么是 模块化 jar 的路径。 (每个路径可以是绝对路径,也可以是相对于当前目录的路径。) 可以多次使用此选项。 --jlink-options <jlink 选项> 要传递给 jlink 的选项列表(用空格分隔) 如果未指定,则默认为 "--strip-native-commands --strip-debug --no-man-pages --no-header-files"。 可以多次使用此选项。 --runtime-image <directory path> 将复制到应用程序映像的预定义 运行时映像的路径 (绝对路径或相对于当前目录的路径) 如果未指定 --runtime-image,jpackage 将运行 jlink 以 使用如下选项创建运行时映像: --strip-debug、--no-header-files、--no-man-pages 和 --strip-native-commands。 用来创建应用程序映像的选项: --input -i <directory path> 包含要打包的文件的输入目录的路径 (绝对路径或相对于当前目录的路径) 输入目录中的所有文件将打包到 应用程序映像中。 --app-content <additional content>[,<additional content>...] 要添加到应用程序有效负载中的文件和/或 目录的逗号分隔路径列表。 此选项可以多次使用。 用来创建应用程序启动程序的选项: --add-launcher <launcher name>=<file path> 启动程序的名称和包含关键字-值对列表的 属性文件的路径 (绝对路径或相对于当前目录的路径) 可以使用关键字 "module"、"main-jar"、"main-class"、"description"、 "arguments"、"java-options"、"app-version"、"icon"、 "launcher-as-service"、 "win-console"、"win-shortcut"、"win-menu"、 "linux-app-category" 和 "linux-shortcut"。 这些选项将添加到原始命令行选项中或者用来覆盖 原始命令行选项,以构建额外的替代启动程序。 将从命令行选项构建主应用程序启动程序。 可以使用此选项构建额外的替代启动程序, 可以多次使用此选项来构建 多个额外的启动程序。 --arguments <main class arguments> 在没有为启动程序提供命令行参数时, 要传递到主类的命令行参数 可以多次使用此选项。 --java-options <java options> 要传递到 Java 运行时的选项 可以多次使用此选项。 --main-class <class name> 要执行的应用程序主类的限定名称 只有在指定了 --main-jar 时才能使用此选项。 --main-jar <main jar file> 应用程序的主 JAR;包含主类 (指定为相对于输入路径的路径) 可以指定 --module 或 --main-jar 选项,但是不能同时指定 两者。 --module -m <module name>[/<main class>] 应用程序的主模块(以及可选的主类) 此模块必须位于模块路径中。 如果指定了此选项,则将在 Java 运行时映像中 链接主模块。可以指定 --module 或 --main-jar 选项, 但是不能同时指定这两个选项。 用来创建应用程序启动程序的与平台相关的选项: --win-console 为应用程序创建控制台启动程序,应当为 需要控制台交互的应用程序指定 用来创建应用程序包的选项: --about-url <url> 应用程序主页的 URL --app-image <directory path> 用来构建可安装程序包的 预定义应用程序映像的位置 (绝对路径或相对于当前目录的路径) --file-associations <file path> 包含关键字-值对列表的属性文件的路径 (绝对路径或相对于当前目录的路径) 可以使用关键字 "extension"、"mime-type"、"icon" 和 "description" 来描述此关联。 可以多次使用此选项。 --install-dir <directory path> 默认安装位置下面的相对子路径 --license-file <file path> 许可证文件的路径 (绝对路径或相对于当前目录的路径) --resource-dir <directory path> 覆盖 jpackage 资源的路径 可以通过向该目录中添加替代资源来覆盖 jpackage 的 图标、模板文件和其他资源。 (绝对路径或相对于当前目录的路径) --runtime-image <directory path> 要安装的预定义运行时映像的路径 (绝对路径或相对于当前目录的路径) 在创建运行时程序包时需要使用选项。 --launcher-as-service 请求创建安装程序,以将主 应用程序启动程序注册为后台服务类型应用程序。 用来创建应用程序包的与平台相关的选项: --win-dir-chooser 添加一个对话框以允许用户选择 产品的安装目录。 --win-help-url <url> 用户可以从中获取更多信息或技术支持的 URL --win-menu 请求为此应用程序添加开始菜单快捷方式 --win-menu-group <menu group name> 此应用程序所在的开始菜单组 --win-per-user-install 请求基于每个用户执行安装 --win-shortcut 请求为此应用程序添加桌面快捷方式 --win-shortcut-prompt 添加一个对话框以允许用户选择是否将由安装程序 创建快捷方式。 --win-update-url <url> 可用应用程序更新信息的 URL --win-upgrade-uuid <id string> 与此程序包的升级相关联的 UUID
-
然后是基础示例
jpackage ^ ^后面都是注释,使用前需要删除掉 --type msi ^ 打包类型为msi --dest ./target ^ 目标文件夹(最终结果输出在这里) --input ./input ^ 输入目录路径(jar包、配置文件等资源,对应的位置为`{安装目录}/app`) --app-content ./content ^ 程序资源目录路径(和`--input`类似,对应的位置为`{安装目录}`) --resource-dir ./resource ^ 覆盖 jpackage 资源的路径,这个路径下的配置用于指导jpackage如何打包(具体什么资源可以参考一下`--temp`中的输出) --name BilibiliDown ^ --main-class nicelee.memory.App ^ 打包后app运行的主类入口 --main-jar launch.jar ^ --java-options -Xmx2048m ^ 打包后app运行的JVM参数 --runtime-image "./minimal-bilibilidown-jre" ^ 指定打包后的自定义jre --icon ./config/favicon.ico ^ --app-version 1.0.3 ^ --vendor "nICEnnnnnnnLee" ^ --copyright "Copyright © 2019-2024 nICEnnnnnnnLee" ^ --win-dir-chooser ^ --win-shortcut-prompt ^ --temp ./temp ^ 创建临时文件的目录 --verbose 输出详细信息