JavaRush /Java Blog /Random-TW /喝咖啡休息#148。如何將任何 Java 程式轉換為獨立的 EXE 文件

喝咖啡休息#148。如何將任何 Java 程式轉換為獨立的 EXE 文件

在 Random-TW 群組發布
來源: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