Sumber: McCue.dev Hari ini Anda akan mempelajari cara membuat file EXE yang dapat dieksekusi dari program Java untuk dijalankan pada sistem operasi Windows. Rehat kopi #148.  Cara mengubah program Java apa pun menjadi file EXE mandiri - 1Mengklik dua kali untuk meluncurkan adalah salah satu cara termudah untuk membuka suatu program. Jika orang yang ingin Anda tunjukkan aplikasinya sudah menginstal versi Java yang benar, mereka dapat mengklik dua kali file jar untuk menjalankannya. Jika Java tidak terinstal, ada cara untuk membuat penginstal yang dapat dieksekusi, seperti jpackage . Setelah itu, untuk menjalankan kodenya Anda hanya perlu mengklik installer ini. Anda juga dapat menggunakan Gambar Asli untuk mengubah kode menjadi file yang dapat dieksekusi yang tidak memerlukan instalasi tambahan apa pun. Pada artikel ini, kami akan fokus pada pendekatan yang cukup sederhana yang berfungsi untuk aplikasi apa pun, apa pun dependensi yang Anda sertakan atau fitur JVM apa yang Anda gunakan. Kode yang akan dibahas hari ini dapat ditemukan di repositori GitHub , dan file yang dapat dieksekusi dengan program tersebut diposting di sini .

Tumpukan yang digunakan

Jawa 9+

java --versi jlink --version

Maven

mvn --versi

NodeJS

npx --versi

Langkah 1: Kompilasi dan kemas kode Anda ke dalam toples

Program dasar ini akan membuat jendela sederhana berisi teks yang dapat Anda ubah dengan mengklik salah satu tombol di antarmuka.
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);
    }
}
Rehat kopi #148.  Cara mengubah program Java apa pun menjadi file EXE mandiri - 2Tujuan kami sekarang adalah mengemas kode beserta dependensinya ke dalam toples. File JAR adalah arsip ZIP biasa dengan sedikit struktur tambahan. Untuk proyek Maven konfigurasinya akan terlihat seperti ini.
<?xml version="1.0" coding="UTF-8"?> <project 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>contoh</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> <dependencies> <dependency> <groupId> org.apache.commons</groupId> <artifactId>commons-text</artifactId> <version>1.9</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache .maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <versi>2.4.3</version> <eksekusi> <eksekusi> <fase>paket</fase> <tujuan> <tujuan> shade</goal> </goals> <configuration> <transformers> <transformer implementasi="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <manifestEntries> <Main-Class>example.Main</Main- Kelas> <Build-Number>1.0</Build-Number> </manifestEntries> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build> </proyek>
Di sini plugin “shade” akan menangani penyertaan kode dari semua dependensi Anda ke dalam toples. Dalam hal ini, satu-satunya ketergantungan eksternal adalah org.apache.commons/commons-text .
paket bersih mvn
Kami kemudian akan memindahkan file jar ini ke direktori target/ baru yang akan dipisahkan dari file lain.
mkdir build mv target/javaexe-1.0.jar build

Langkah 2: Buat Java Runtime Environment (JRE)

Untuk menjalankan file jar yang telah kita buat, kita perlu menautkannya ke lingkungan runtime Java. Untuk ini kita akan menggunakan jlink . Karena ekosistem Java tidak menggunakan modul, Anda mungkin belum pernah mendengarnya atau menggunakan jlink. Singkatnya, jlink dapat membuat "gambar khusus yang dapat dieksekusi". Misalnya Anda sedang membuat web server. Anda tidak memerlukan AWT atau Swing, jadi memasukkannya ke dalam kode Anda akan menjadi mubazir. Dengan jlink Anda dapat membuat JRE yang tidak menyertakan modul java.desktop sama sekali . Sistem ini berfungsi paling baik jika aplikasi Anda dan semua dependensinya menyertakan file module-info.java yang dikompilasi , yang memberi tahu jlink modul apa yang ingin Anda sertakan. Anda juga dapat secara manual menentukan daftar modul yang diperlukan menggunakan jdeps . Dan bahkan tanpa proyek modular, kita dapat secara efektif mengkloning instalasi Java kita ke dalam direktori menggunakan jlink.
jlink --add-modules ALL-MODULE-PATH --output build/runtime
Menyertakan setiap modul secara individual memastikan bahwa perpustakaan seperti org.apache.commons/commons-text akan berfungsi sebagaimana mestinya. Kita hanya perlu mencari tahu modul mana yang kita butuhkan.

Langkah 3: Gabungkan Jar dan JRE menjadi sebuah executable

Memiliki file jar yang berisi kode dan semua dependensinya, serta JRE, yang tersisa hanyalah menggabungkannya. Untuk melakukan ini kita perlu melakukan hal berikut:
  1. Zip direktori yang berisi JRE dan jar aplikasi Anda.
  2. Lampirkan skrip rintisan ke bagian atas file zip ini, yang akan mengekstrak data ke direktori sementara dan menjalankan kodenya.
Ada perpustakaan JavaScript untuk ini yang disebut caxa . Tujuannya adalah untuk mengubah proyek NodeJS menjadi executable, dan juga dapat menggabungkan semua instalasi NodeJS pada sistem. Untungnya, Anda dapat melewati langkah ini dengan menentukan tanda --no-include-node .
npx caxa \ --input build \ --output application \ --no-include-node \ -- ​​​​"{{caxa}}/runtime/bin/java" "-jar" "{{caxa}}/javaexe -1.0 .jar"
Ini akan membuat file yang dapat dieksekusi bernama "aplikasi". Jika Anda membuatnya untuk Windows, maka Anda perlu menentukan “application.exe”. Saat executable dijalankan, {{caxa}} akan diganti dengan direktori sementara tempat file zip di-deploy. Harap dicatat bahwa saat membuat file yang dapat dieksekusi, mekanisme seperti penandatanganan kode dan pembaruan otomatis juga digunakan. Namun hal-hal tersebut memerlukan kajian lebih dalam sehingga sulit untuk dimuat dalam satu publikasi.