把Java程序打包为可执行文件

目录

  • 前置
  • [1. 使用 jlink 创建自定义运行时镜像](#1. 使用 jlink 创建自定义运行时镜像)
    • [1.1 打包需要的最小运行时环境:](#1.1 打包需要的最小运行时环境:)
    • [1.2 打包整个jdk:](#1.2 打包整个jdk:)
    • [1.3 使用 java.se 聚合模块打包:](#1.3 使用 java.se 聚合模块打包:)
  • [2. 使用jpackage打包并嵌入自定义JRE](#2. 使用jpackage打包并嵌入自定义JRE)

前置

注意最好采用普通打包,即不要使用repackage打成fat jar, 因为jpackage识别不了fat jar包的内部结构. pom.xml中相关改动示意如下:

jlink 是 JDK 9 引入的一个重要工具,可根据指定的模块列表,创建自定义的 Java 运行时镜像,只包含应用程序实际需要的 Java 模块,减少运行时体积。

1.1 打包需要的最小运行时环境:

先运行 jdeps 命令来分析JAR包所依赖的JDK模块 :

复制代码
。。。\jdk-17\bin\jdeps  --list-deps --multi-release 17 --ignore-missing-deps D:\造物云换脸\vision-backend\target\vision-backend-0.0.1-SNAPSHOT.jar D:\造物云换脸\vision-backend\target\libs\WIN64\*.jar D:\造物云换脸\vision-backend\target\libs\*.jar

[1](#1)

因为返回了:

复制代码
java.base
java.desktop

所以有:

复制代码
。。。\jdk-17\bin\jlink --module-path D:\Java\jdk-17/jmods --add-modules java.base,java.desktop --output my-jre --compress 2 --no-header-files --no-man-pages

1.2 打包整个jdk:

复制代码
。。。\jdk-17\bin\jlink --module-path D:\Java\jdk-17/jmods --add-modules ALL-MODULE-PATH --output my-complete-jre --compress 2 --no-header-files --no-man-pages

1.3 使用 java.se 聚合模块打包:

JDK 提供了 java.se 模块,它聚合了 Java SE 标准规范的所有模块。

复制代码
。。。\jdk-17\bin\jlink --module-path D:\Java\jdk-17/jmods --add-modules java.se --output my-jre --compress 2 --no-header-files --no-man-pages

在项目实践中,我发现java.se模块不够用,比如fastjson会报java.lang.ExceptionInInitializerError: Exception com.alibaba.fastjson2.JSONException: init unsafe error 。我对fastjson包进行jdeps发现它依赖jdk.unsupported模块

2. 使用jpackage打包并嵌入自定义JRE

复制代码
。。。\jdk-17\bin\jpackage --type app-image --input D:\造物云换脸\vision-backend\target/ --main-jar vision-backend-0.0.1-SNAPSHOT.jar --main-class com.zju.design.visionbackend.ui.MainApp --runtime-image D:\造物云换脸\vision-backend\my-complete-jre --name 智能大屏 --java-options "-DbuiltIn.exeForm=true -Dfile.encoding=UTF-8 -cp D:\造物云换脸\vision-backend\target\vision-backend-0.0.1-SNAPSHOT.jar;D:\造物云换脸\vision-backend\target\libs/*"

jpackage参数说明:

参数 说明
--type app-image 生成文件夹版,无需WiX ^[2](#参数 说明 –type app-image 生成文件夹版,无需WiX 2 –input Jar包所在目录 –runtime-image 内置JRE –icon 可选:去掉则用默认Java图标 –win-console 显示控制台, 默认不显示 –java-options “-Xmx512m -XX:+UseG1GC” 可选:JVM参数(如最大堆512MB,优化启动))^
--input Jar包所在目录
--runtime-image 内置JRE
--icon 可选:去掉则用默认Java图标
--win-console 显示控制台, 默认不显示
--java-options "-Xmx512m -XX:+UseG1GC" 可选:JVM参数(如最大堆512MB,优化启动)

  1. 当出现错误: 缺少被依赖对象:在模块路径和类路径中未找到类,要隐藏此错误,请使用 --ignore-missing-deps ↩︎

  2. 如果要打包成MSI 安装包,则需要先安装WiX Toolset。WiX Toolset 是一个开源的 Windows 安装包开发工具集,用于创建 Windows Installer(MSI)和 Windows Setup(EXE)安装程序 ↩︎

相关推荐
LostSpeed1 个月前
JLink突然连接不上MCU的处理方法
jlink
LostSpeed1 个月前
eclipse-embedcpp + JLink-edu-mini + MKS SGEN_L V1.0 调试固件工程 v1
eclipse·lpc·jlink·embedcpp
LostSpeed1 个月前
openpnp - Smoothieware - MKS SGEN_L V1.0 + JLink-edu-mini 连接测试
openpnp·jlink·mks·smoothieware
Mr_Johhny10 个月前
Eclipse IDE for ModusToolbox™ 3.4环境通过JLINK调试CYT4BB
jlink·cyt4bb·modustoolbox
【 STM32开发 】10 个月前
STM32 -- 仿真器 ST-Link、J-Link 的连接、参数设置
stm32·物联网·jlink·stlink·仿真器·烧录器
乔宕一1 年前
在 vscode + cmake + GNU 工具链的基础上配置 JLINK
vscode·gnu·jlink
不咸不要钱2 年前
FreeRtos学习笔记(12)systemView 分析任务调度情况
单片机·freertos·任务调度·jlink·systemview
m1f2c32 年前
后端程序员开发win小工具(未完待续)
java·thymeleaf·jpackage
CodingCos2 年前
【ARMv8M Cortex-M33 系列 2.3 -- SEGGER JFlash 烧写命令介绍】
cortex-m33·jflash·jlink·segger