Jpackage-制作无需预装Java环境的Jar可执行程序
JAR 包要在预装 JRE 环境的系统上执行。如果没有预先安装 JRE 环境,又想直接运行 Java 程序,该怎么办呢?

这篇文章我们会先学习如何将 Java 程序打包成一个可执行的 Java JAR 文件。然后演示如何使用这个 JAR 文件生成 Windows、Linux、MacOS 上的可执行程序。 我们将使用 Java 自带的 jar 命令行工具来创建 JAR 文件。然后学会使用 jpackage 工具创建各个系统上的可执行程序。
注意:jpackage 工具从 Java 14 版本开始提供的,可以用来生成可执行程序。
什么是 jar
jar 文件是一个包含编译后的 Java Class 文件和其他资源的容器。它基于广泛使用的 ZIP 文件格式,因此 jar 文件可以使用 ZIP解压缩工具解压。 一个可执行的 jar 文件需要包含一个 main 类作为程序的入口,并在 MANIFEST.MF 文件中指定
但是为了运行 jar 格式的应用程序,必须有一个Java 运行时环境(JRE)。
jar 命令
Java 的 jar 命令是 Java Archive Tool,它是一个用于创建、查看和管理 jar 文件的命令行工具。此工具包含在 JDK 中。
详细介绍 jar 命令的使用不是本文目的,下面给出 jar 命令的常见用法。
创建一个输出 Hello 的Java 类用于测试。
目录结构:
├── Hello.java
└── META-INF
└── MANIFEST.MF
查看文件内容然后编译 Hello.java
public class Hello{
public static void main(String[] args) throws InterruptedException{
System.out.println("Hello");
// 3s 后退出
Thread.sleep(3 * 1000);
}
}
// 编译:javac Hello.java
配置 MANIFEST.MF 文件,注意,最后一定要有一个换行,否则可能在 Windows 上运行失败。
Manifest-Version: 1.0
Main-Class: Hello
创建 jar 文件
jar cmf META-INF/MANIFEST.MF hello.jar Hello.class
其中
c表示创建新的归档文件,m指定清单文件,f指定生成的 jar 文件的名称,最后是要添加到 jar 包中的文件列表。执行 jar 文件
java -jar hello.jar
Hello
查看 jar 文件
$ jar tf hello.jar
META-INF/
META-INF/MANIFEST.MF
Hello.class
其中
t为list,列出文件。f指定 jar 文件。
创建 jar 文件有多种方式,比如借助 Maven 或者 Gradle 工具都可以打包 Java 程序为 jar 文件,而且更加方便。比如 Spring Boot 开发过程中, mvn package 即可生成 jar 文件。
jpackage 命令
jpackage 命令是从 Java 14 开始提供的,可以帮助我们为模块化或非模块化 Java 应用程序生成指定系统平台的可执行程序,而不用预先安装 JRE 环境。如何做到的呢?
我们知道 Java 程序必须在 JRE环境才能运行, jpackage 其实是把 JRE 和 JAR 文件以及所有必要依赖项一起打包生成指定平台的可执行程序。例如 Windows 上的 exe 或 macOS 上的 dmg。每种格式都必须构建在其运行的平台上,没有跨平台支持。工具还提供了常见的自定义操作,如应用名,应用图标等。
查看 jpackage 帮助:
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>
对预定义应用程序映像进行签名:
jpackage --type app-image --app-image <app-image> \
--mac-sign [<additional signing options>...]
注:此模式下允许的其他选项只有:
一组其他 mac 签名选项和 --verbose
........
jpackage 创建可执行文件
创建可执行程序命令格式:
jpackage --input . --name YouAppName --main-jar youfile.jar
现在让我们使用上面的 hello.jar 来创建一个可执行的JAR文件。hello.jar 直接运行会输出 Hello 字符。
Windows 平台
注意: 对于 Windows,
jpackage需要 WiX 3.0 或更高版本。Winx3.14 下载:https://github.com/wixtoolset/wix3/releases/tag/wix314rtm
由于 hello.jar 是一个命令行程序,没有 UI界面,因此打包时使用 --win-console 参数配置以命令行方式启动。
常见的 Windows 下 jpackage 参数还有:
- --type : 指定打包后的格式,如 msi、exe,默认 exe。
- --win-console:使用控制台窗口启动我们的应用程序
- --win-shortcut : 在 Windows 开始菜单中创建快捷方式文件
- --win-dir-chooser:让最终用户指定自定义目录来安装可执行文件
打包成 exe 程序。
jpackage --input . --name helloApp1 --win-console --win-shortcut --main-jar hello.jar
打包后可以得到 helloApp1-1.0.exe 文件。
PS C:\Users\Administrator\Desktop\test> jpackage --input . --name helloApp --win-console --win-shortcut --main-jar hello.jar
PS C:\Users\Administrator\Desktop\test> ls
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2024/3/7 22:14 526 Hello.class
-a---- 2024/3/7 22:14 802 hello.jar
-a---- 2024/3/7 22:13 208 Hello.java
-a---- 2024/3/7 22:17 110145536 helloApp1-1.0.exe
-a---- 2024/3/7 21:58 42 MANIFEST.MF
直接双击运行安装。

安装完成后,桌面上会出现图标,双击可以运行并输出 Hello 字符串。

Mac 平台
Mac 平台运行 jpackage 命令会自动生成 dmg 安装包。
jpackage --input . --name hello --main-jar hello.jar
生成 hello-1.0.dmg 文件,双击弹出安装界面。

因为测试程序 hello.jar 是一个输出 Hello 字符串的命令行程序,并没有 UI,因此测试从命令行启动查看输出。
➜ ~ /Applications/hello.app/Contents/MacOS/hello
Hello
Linux 平台
jpackage --input . --name hello --main-jar hello.jar
我所在 Linux 系统为 Ubuntu22 ,所以生成安装包 hello_1.0_amd64.deb 。
$ ls -l -h
total 37M
-rw-r--r-- 1 root root 37M Mar 7 16:50 hello_1.0_amd64.deb
-rw-r--r-- 1 root root 401 Mar 6 11:42 Hello.class
-rw-r--r-- 1 root root 1.1K Mar 7 16:42 hello.jar
-rw-r--r-- 1 root root 96 Mar 6 11:41 Hello.java
-rw-r--r-- 1 root root 41 Mar 6 11:42 MANIFEST.MF
安装 hello_1.0_amd64.deb 。
$ apt install hello_1.0_amd64.deb
安装后命令位于 /opt 目录下,运行测试:
$ /opt/hello/bin/hello
Hello
总结
本文介绍了在没有预装 JRE 环境的系统上运行 Java 程序的方法。首先,介绍如何使用 Java 的 jar 命令行工具创建一个可执行的 JAR 文件,这需要编写 Java 程序,配置 MANIFEST.MF 文件,并使用 jar 命令创建包含主类的 JAR 文件。接着,介绍了 jpackage 工具(从 Java 14 版本开始提供),该工具可以打包 JAR 文件和必要的 JRE 环境,生成适用于 Windows、Linux、MacOS 的可执行程序,使得 Java 应用程序能够在无需预装 JRE 的情况下运行。
参考
本文 Github.com/niumoo/JavaNotes仓库已经收录。
本文原发于网站:Jpackage - 制作无需预装 Java 环境的 Jar 可执行程序
本文原发于公众号:程序猿阿朗
Jpackage-制作无需预装Java环境的Jar可执行程序的更多相关文章
- java程序在没有java环境的电脑上执行的方法(关键词jar,exe)
可以让你写的java程序在别人没有任何java配置以及环境的情况下执行 写好程序 在程序对应的package上右键->export->java->Runnable JAR file- ...
- Java环境变量配置以及作用、JDK与JRE区别以及命令行引入jar包
在配置环境变量中: 设置JAVA_HOME: 一是为了方便引用,比如,JDK安装在C:\jdk1.6.0目录里,则设置JAVA_HOME为该目录路径, 那么以后要使用这个路径的时候, 只需输入%JAV ...
- Java环境安装配置好了却不能运行xxx.jar程序?
1,检查Java环境是否已安装或配置成功. WIN+R → cmd → java -version,查看是否可以读取到Java版本信息,如果读取不到,说明Java环境安装或配置有问题,重新装一下. 2 ...
- java环境的配置——实现win10下双击直接运行jar文件
java环境的配置--实现win10下双击直接运行jar文件 在渗透测试的过程中很多工具的安装和使用需要java环境,下面我来介绍一下java环境配置的超详细步骤(包含怎样实现win10下双击直接运行 ...
- Java环境变量的简记
1,安装版的jre或jdk.安装后如果不做开发用,则只是做Java运行时环境,则不需要手动配置任何Java环境变量. 2,绿色解压版(拷贝版)jdk或jre.运行和开发都需要配置环境变量. 运行Jav ...
- java开发常用jar包介绍(转载)
jta.jar 标准JTA API必要 commons-collections.jar 集合类 必要 antlr.jar ANother Tool for Language Recognition ...
- (转)java之runnable jar与普通jar
背景:项目中有时候需要导出相关的jar包,可是总是不能分清楚. 1 导出包 导出普通jar包(可作为第三方库,类似dll,so等) 在eclipse中右键选择except->java->j ...
- docker java环境 直接做成镜像 跑自己的java包
yum install docker #基于阿里源 可以直接下载 systemctl restart docker ifconfig #出现 docker0 说明环境部署成功 docker ver ...
- Java环境配置与编译运行详解
这篇文章主要为大家详细介绍了Java环境配置与编译运行的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 一.开篇 通过对之前Java之路的了解之后,相信初学者们都对Java有了一个比较深印 ...
- 细分java环境中的JDK、JVM、JRE
细分java环境中的JDK.JVM.JRE 近来小看了下Android,扑面而来一堆概念JDK.JVM.JRE.SDK.NDK.ADT.缕了一下,其中JDK.JVM.JRE是java环境的东西,而SD ...
随机推荐
- Docker获取Let`s Encrypt SSL 证书
文中的操作都是在CentOS Stream release 9下执行的,使用的是root用户. 1. 安装docker # 卸载原有的docker yum remove docker docker-c ...
- 【主流技术】聊一聊对 Mybatis Plus 的理解与应用
前言 mybatis plus是一个mybatis的增强工具,在其基础上只做增强不做改变.作为开发中常见的第三方组件,学习并应用在项目中可以节省开发时间,提高开发效率. 官方文档地址:MyBatis- ...
- 4.1 C++ Boost 字符串处理库
Boost 库是一个由C/C++语言的开发者创建并更新维护的开源类库,其提供了许多功能强大的程序库和工具,用于开发高质量.可移植.高效的C应用程序.Boost库可以作为标准C库的后备,通常被称为准标准 ...
- vue-cli3创建多页面应用
首先用vue-cli3创建工程,我的全局安装了vue-cli2,又不想卸载掉:所以新建了一个文件夹安装vue-cli3:然后在该文件夹下创建工程: 同时安装vue-cli2和vue-cli3参考:ht ...
- 音频处理实用AI工具
最近在做音频处理相关的工作,主要有以下几个好用的工具. 1. 语音转文字--whisper 这是一款由OpenAI开发的语音转文字工具,项目地址位于:openai/whisper. 这个工具是用来生成 ...
- delphi IDE 控件居中的方法
- [Spring]Junit单元测试时取不到本地文件问题
Junit单元测试时取不到本地文件问题 问题 当使用Junit进行单元测试时,遇到了以下问题: 2022-10-24 16:13:19.902 [main] ERROR zonetop.gisboot ...
- 反编译工具Jadx for MAC 安装与配置
Jadx安装与配置 安装jadx brew install jadx 配置环境变量 先找到java安装位置 (base) # chen at Little-M1-Wrok in /usr/bin [1 ...
- Matplotlib绘制散点图与条形图
Matplotlib绘制散点图与条形图 绘制散点图 # 绘制散点图 from matplotlib import pyplot as plt from matplotlib import font_m ...
- windows远程连接centos及闪退异常解决记录
平时在学校实验室写代码用的环境是linux系统,放假回家之后之后笔记本的性能和系统多少有些不方便,因此使用服务器安装IDEA进行编程,记录一下远程桌面的安装及出现的问题解决. 一. 安装Centos ...