JavaRush /Blog Java /Random-MS /Coffee break #148. Bagaimana untuk menukar mana-mana prog...

Coffee break #148. Bagaimana untuk menukar mana-mana program Java menjadi fail EXE kendiri

Diterbitkan dalam kumpulan
Sumber: Mccue.dev Hari ini anda akan belajar cara mencipta fail EXE boleh laku daripada program Java untuk dijalankan pada sistem pengendalian Windows. Coffee break #148.  Bagaimana untuk menukar mana-mana program Java menjadi fail EXE kendiri - 1Klik dua kali untuk melancarkan adalah salah satu cara paling mudah untuk membuka program. Jika orang yang anda ingin tunjukkan aplikasi anda sudah mempunyai versi Java yang betul dipasang, mereka boleh mengklik dua kali fail jar untuk menjalankannya. Jika ia tidak memasang Java, terdapat cara untuk mencipta pemasang boleh laku, seperti jpackage . Selepas itu, untuk menjalankan kod anda hanya perlu klik pada pemasang ini. Anda juga boleh menggunakan Imej Asli untuk menukar kod menjadi fail boleh laku yang tidak memerlukan sebarang pemasangan tambahan. Dalam artikel ini, kami akan menumpukan pada pendekatan yang agak mudah yang berfungsi untuk sebarang aplikasi, tidak kira apa kebergantungan yang anda sertakan atau ciri JVM yang anda gunakan. Kod yang akan dibincangkan hari ini boleh didapati dalam repositori GitHub dan fail boleh laku dengan atur cara disiarkan di sini .

Timbunan digunakan

Java 9+

java --version jlink --version

Maven

mvn --version

NodeJS

npx --version

Langkah 1: Susun dan bungkus kod anda ke dalam balang

Program asas ini akan mencipta tetingkap ringkas dengan teks yang boleh anda ubah dengan mengklik pada salah satu butang dalam antara muka.
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);
    }
}
Coffee break #148.  Bagaimana untuk menukar mana-mana program Java menjadi fail EXE kendiri - 2Matlamat kami sekarang ialah untuk membungkus kod bersama-sama dengan kebergantungannya ke dalam balang. Fail JAR ialah arkib ZIP biasa dengan sedikit struktur tambahan. Untuk projek Maven konfigurasi akan kelihatan seperti ini.
<?xml version="1.0" encoding="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> <version>2.4.3</version> <executions> <execution> <phase>package</phase> <goals> <goal> teduh</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <manifestEntries> <Main-Class>example.Main</Main- Class> <Build-Number>1.0</Build-Number> </manifestEntries> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build> </projek>
Di sini pemalam "teduhan" akan mengendalikan termasuk kod daripada semua kebergantungan anda ke dalam balang. Dalam kes ini, satu-satunya pergantungan luaran ialah org.apache.commons/commons-text .
pakej bersih mvn
Kami kemudiannya akan mengalihkan fail jar ini ke sasaran/ direktori baharu di mana ia akan dipisahkan daripada fail lain.
mkdir bina mv target/javaexe-1.0.jar bina

Langkah 2: Cipta Persekitaran Masa Jalan Java (JRE)

Untuk menjalankan fail jar yang telah kami buat, kami perlu memautkannya ke persekitaran runtime Java. Untuk ini kami akan menggunakan jlink . Memandangkan ekosistem Java tidak menggunakan modul, anda mungkin tidak pernah mendengarnya atau menggunakan jlink. Pendek kata, jlink boleh mencipta "imej boleh laku tersuai". Sebagai contoh, anda sedang membuat pelayan web. Anda tidak memerlukan AWT atau Swing, jadi memasukkannya dalam kod anda akan menjadi berlebihan. Dengan jlink anda boleh mencipta JRE yang tidak termasuk modul java.desktop sama sekali . Sistem ini berfungsi paling baik jika aplikasi anda dan semua kebergantungannya termasuk fail module-info.java yang disusun , yang memberitahu jlink dengan tepat modul yang anda ingin sertakan. Anda juga boleh mentakrifkan senarai modul yang diperlukan secara manual menggunakan jdeps . Dan walaupun tanpa projek modular, kami boleh mengklon pemasangan Java kami dengan berkesan ke dalam direktori menggunakan jlink.
jlink --add-modules ALL-MODULE-PATH --output build/runtime
Memasukkan setiap modul secara individu memastikan perpustakaan seperti org.apache.commons/commons-text akan berfungsi seperti yang dimaksudkan. Kami hanya perlu memikirkan modul mana yang kami perlukan.

Langkah 3: Gabungkan Jar dan JRE menjadi boleh laku

Mempunyai fail jar yang mengandungi kod dan semua kebergantungannya, serta JRE, yang tinggal hanyalah menggabungkannya. Untuk melakukan ini kita perlu melakukan perkara berikut:
  1. Zip direktori yang mengandungi JRE dan balang aplikasi anda.
  2. Lampirkan skrip rintisan pada bahagian atas fail zip ini, yang akan mengekstrak data ke dalam direktori sementara dan menjalankan kod tersebut.
Terdapat perpustakaan JavaScript untuk ini dipanggil caxa . Tujuannya adalah untuk menjadikan projek NodeJS menjadi boleh laku, dan ia juga boleh menggabungkan sebarang pemasangan NodeJS pada sistem. Nasib baik, anda boleh melangkau langkah ini dengan menentukan bendera --no-include-node .
npx caxa \ --input build \ --output application \ --no-include-node \ -- ​​​​"{{caxa}}/runtime/bin/java" "-jar" "{{caxa}}/javaexe -1.0 .jar"
Ini akan mencipta fail boleh laku bernama "aplikasi". Jika anda menciptanya untuk Windows, maka anda perlu menentukan "application.exe". Apabila boleh laku dijalankan, {{caxa}} akan digantikan dengan direktori sementara tempat fail zip digunakan. Sila ambil perhatian bahawa semasa membuat fail boleh laku, mekanisme seperti tandatangan kod dan kemas kini automatik juga digunakan. Walau bagaimanapun, perkara ini memerlukan kajian yang lebih mendalam, yang sukar untuk dimuatkan ke dalam satu penerbitan.
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION