JavaRush /Java 博客 /Random-ZH /喝咖啡休息#148。如何将任何 Java 程序转换为独立的 EXE 文件

喝咖啡休息#148。如何将任何 Java 程序转换为独立的 EXE 文件

已在 Random-ZH 群组中发布
来源:Mccue.dev 今天您将学习如何从 Java 程序创建可执行 EXE 文件以在 Windows 操作系统上运行。 喝咖啡休息#148。 如何将任何 Java 程序转换为独立的 EXE 文件 - 1双击启动是打开程序最简单的方法之一。如果您想要向其展示应用程序的人已经安装了正确版本的 Java,他们可以双击 jar 文件来运行它。如果没有安装 Java,可以通过多种方法创建可执行安装程序,例如jpackage。之后,要运行代码,您只需单击此安装程序即可。您还可以使用Native Image将代码转换为可执行文件,无需任何额外安装。在本文中,我们将重点介绍一种适用于任何应用程序的相当简单的方法,无论您包含什么依赖项或使用什么 JVM 功能。今天要讨论的代码可以在GitHub 存储库中找到,并且该程序的可执行文件也发布在此处

使用的堆栈

Java 9+

java --version jlink --version

梅文

mvn --版本

NodeJS

npx --版本

第 1 步:编译代码并将其打包到 jar 中

这个基本程序将创建一个简单的窗口,其中包含文本,您可以通过单击界面中的按钮之一来更改该文本。
package example;

import org.apache.commons.text.WordUtils;

import javax.swing.*;
import java.awt.*;

public class Main {
    public static void main(String[] args) {
        var label = new JLabel("Hello, World!");
        label.setFont(new Font("Serif", Font.PLAIN, 72));

        var uppercaseButton = new JButton("Uppercase");
        uppercaseButton.addActionListener(e ->
            label.setText(WordUtils.capitalize(label.getText()))
        );

        var lowercaseButton = new JButton("lowercase");
        lowercaseButton.addActionListener(e ->
            label.setText(WordUtils.uncapitalize(label.getText()))
        );

        var panel = new JPanel();
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
        panel.add(label);
        panel.add(uppercaseButton);
        panel.add(lowercaseButton);

        var frame = new JFrame("Basic Program");
        frame.add(panel);
        frame.pack();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
}
喝咖啡休息#148。 如何将任何 Java 程序转换为独立的 EXE 文件 - 2我们现在的目标是将代码及其依赖项打包到 jar 中。JAR 文件是常规的 ZIP 存档,几乎没有额外的结构。对于Maven项目,配置将如下所示。
<?xml 版本=“1.0”编码=“UTF-8”?> <项目 xmlns=“http://maven.apache.org/POM/4.0.0” xmlns:xsi=“http://www.w3” .org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>示例</groupId> <artifactId>javaexe</artifactId> <version>1.0</version> <properties> <project.build.sourceEncoding>UTF-8</project .build.sourceEncoding> <maven.compiler.source>18</maven.compiler.source> <maven.compiler.target>18</maven.compiler.target> </properties> <dependency> <dependency> <groupId> org.apache.commons</groupId> <artifactId>commons-text</artifactId> <version>1.9</version> </dependency> </dependency> <build> <plugins> <plugin> <groupId>org.apache .maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>2.4.3</version> <executions> <execution> <phase>package</phase> <goals> <goal>阴影</目标> </目标> <配置> <transformers> <transformer实现=“org.apache.maven.plugins.shade.resource.ManifestResourceTransformer”> <manifestEntries> <Main-Class>example.Main</Main-类> <Build-Number>1.0</Build-Number> </manifestEntries> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build> </项目>
在这里,“shade”插件将处理将所有依赖项中的代码包含到 jar 中。在这种情况下,唯一的外部依赖项是org.apache.commons/commons-text
mvn清理包
然后,我们将此 jar 文件移动到新的target/目录,在该目录中它将与其他文件分开。
mkdir 构建 mv target/javaexe-1.0.jar 构建

步骤 2:创建 Java 运行时环境 (JRE)

为了运行我们已经创建的 jar 文件,我们需要将其链接到 Java 运行时环境。为此,我们将使用jlink。由于 Java 生态系统不使用模块,因此您可能没有听说过它们或使用过 jlink。简而言之,jlink 可以创建“自定义可执行映像”。例如,您正在制作一个网络服务器。您不需要 AWT 或 Swing,因此将它们包含在代码中将是多余的。使用 jlink,您可以创建一个根本不包含java.desktop模块的 JRE 。如果您的应用程序及其所有依赖项包含已编译的module-info.java文件(该文件准确地告诉 jlink 您想要包含哪些模块),则该系统效果最佳。您还可以使用jdeps手动定义所需模块的列表。即使没有模块化项目,我们也可以使用 jlink 有效地将 Java 安装克隆到目录中。
jlink --add-modules ALL-MODULE-PATH --output 构建/运行时
单独包含每个模块可确保org.apache.commons/commons-text 等库按预期工作。我们只需要弄清楚我们需要哪些模块。

步骤 3:将 Jar 和 JRE 合并为可执行文件

有了一个包含代码及其所有依赖项以及 JRE 的 jar 文件,剩下的就是将它们组合起来。为此,我们需要执行以下操作:
  1. 压缩包含应用程序的 JRE 和 jar 的目录。
  2. 将存根脚本附加到该 zip 文件的顶部,该脚本会将数据提取到临时目录中并运行代码。
有一个名为caxa的 JavaScript 库。它的目的是将 NodeJS 项目转换为可执行文件,并且还可以捆绑系统上的任何 NodeJS 安装。幸运的是,您可以通过指定--no-include-node标志来跳过此步骤。
npx caxa \ --input build \ --output application \ --no-include-node \ -- ​​“{{caxa}}/runtime/bin/java”“-jar”“{{caxa}}/javaexe -1.0.jar”
这将创建一个名为“application”的可执行文件。如果您为 Windows 创建它,则需要指定“application.exe”。当可执行文件运行时,{{caxa}} 将替换为部署 zip 文件的临时目录。请注意,在创建可执行文件时,还会使用代码签名和自动更新等机制。然而,这些事情需要更深入的研究,很难用一篇出版物来概括。
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION