文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Jpackage-制作无需预装Java环境的Jar可执行程序

2024-11-30 00:37

关注

这篇文章我们会先学习如何将 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 

示例用法:
--------------
    生成适合主机系统的应用程序包:
        对于模块化应用程序:
            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 [...]
            jpackage --type app-image -n name \
                -m moduleName/className --runtime-image appRuntimeImage
    生成 Java 运行时程序包:
        jpackage -n name --runtime-image 
    对预定义应用程序映像进行签名:
        jpackage --type app-image --app-image  \
            --mac-sign [...]
        注:此模式下允许的其他选项只有:
              一组其他 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 参数还有:

打包成 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

直接双击运行安装。

图片

安装 helloApp1-1.0.exe

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

图片

运行 helloApp1

Mac 平台

Mac 平台运行 jpackage 命令会自动生成 dmg 安装包。

jpackage --input . --name hello --main-jar hello.jar

生成 hello-1.0.dmg 文件,双击弹出安装界面。

图片

Jpackage 生成 Mac 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 的情况下运行。

参考

来源:程序猿阿朗内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯