Sumber: Mccue.dev Hari ini anda akan belajar cara mencipta fail EXE boleh laku daripada program Java untuk dijalankan pada sistem pengendalian Windows. Klik 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);
}
}
Matlamat 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:- Zip direktori yang mengandungi JRE dan balang aplikasi anda.
- Lampirkan skrip rintisan pada bahagian atas fail zip ini, yang akan mengekstrak data ke dalam direktori sementara dan menjalankan kod tersebut.
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.
GO TO FULL VERSION