JavaRush /Java-Blog /Random-DE /Kaffeepause Nr. 148. So verwandeln Sie jedes Java-Program...

Kaffeepause Nr. 148. So verwandeln Sie jedes Java-Programm in eine eigenständige EXE-Datei

Veröffentlicht in der Gruppe Random-DE
Quelle: Mccue.dev Heute erfahren Sie, wie Sie aus einem Java-Programm eine ausführbare EXE-Datei für die Ausführung auf dem Windows-Betriebssystem erstellen. Kaffeepause Nr. 148.  So verwandeln Sie jedes Java-Programm in eine eigenständige EXE-Datei - 1Ein Doppelklick zum Starten ist eine der einfachsten Möglichkeiten, ein Programm zu öffnen. Wenn die Person, der Sie Ihre Anwendung zeigen möchten, bereits die richtige Java-Version installiert hat, kann sie auf die JAR-Datei doppelklicken, um sie auszuführen. Wenn Java nicht installiert ist, gibt es Möglichkeiten, ein ausführbares Installationsprogramm zu erstellen, z. B. jpackage . Um den Code auszuführen, müssen Sie anschließend nur noch auf dieses Installationsprogramm klicken. Sie können Native Image auch verwenden , um den Code in eine ausführbare Datei umzuwandeln, die keine zusätzliche Installation erfordert. In diesem Artikel konzentrieren wir uns auf einen relativ einfachen Ansatz, der für jede Anwendung funktioniert, unabhängig davon, welche Abhängigkeiten Sie einbeziehen oder welche JVM-Funktionen Sie verwenden. Der heute besprochene Code befindet sich im GitHub-Repository und die ausführbaren Dateien mit dem Programm werden hier veröffentlicht .

Stapel verwendet

Java 9+

java --version jlink --version

Maven

mvn --version

NodeJS

npx --version

Schritt 1: Kompilieren Sie Ihren Code und packen Sie ihn in ein JAR

Dieses Basisprogramm erstellt ein einfaches Fenster mit Text, den Sie ändern können, indem Sie auf eine der Schaltflächen in der Benutzeroberfläche klicken.
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);
    }
}
Kaffeepause Nr. 148.  So verwandeln Sie jedes Java-Programm in eine eigenständige EXE-Datei - 2Unser Ziel ist es nun, den Code zusammen mit seinen Abhängigkeiten in ein JAR zu packen. JAR-Dateien sind normale ZIP-Archive mit wenig zusätzlicher Struktur. Für ein Maven- Projekt sieht die Konfiguration folgendermaßen aus.
<?xml version="1.0" binding="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>example</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> Shade</goal> </goals> <configuration> <transformers> <transformer Implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <manifestEntries> <Main-Class>example.Main</Main- Klasse> <Build-Number>1.0</Build-Number> </manifestEntries> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build> </Projekt>
Hier übernimmt das „Shade“-Plugin das Einfügen von Code aus all Ihren Abhängigkeiten in das JAR. In diesem Fall ist die einzige externe Abhängigkeit org.apache.commons/commons-text .
mvn sauberes Paket
Anschließend verschieben wir diese JAR-Datei in ein neues Zielverzeichnis/ , wo sie von anderen Dateien getrennt wird.
mkdir build mv target/javaexe-1.0.jar build

Schritt 2: Erstellen Sie eine Java Runtime Environment (JRE)

Um die bereits erstellte JAR-Datei auszuführen, müssen wir sie mit der Java-Laufzeitumgebung verknüpfen. Dazu verwenden wir jlink . Da das Java-Ökosystem keine Module verwendet, haben Sie wahrscheinlich noch nie davon gehört oder jlink verwendet. Kurz gesagt, jlink kann „benutzerdefinierte ausführbare Bilder“ erstellen. Sie erstellen beispielsweise einen Webserver. Sie benötigen weder AWT noch Swing, daher ist es überflüssig, diese in Ihren Code aufzunehmen. Mit jlink können Sie eine JRE erstellen, die das Modul java.desktop überhaupt nicht enthält . Dieses System funktioniert am besten, wenn Ihre Anwendung und alle ihre Abhängigkeiten kompilierte module-info.java- Dateien enthalten , die jlink genau mitteilen, welche Module Sie einbinden möchten. Sie können die Liste der erforderlichen Module auch manuell mit jdeps definieren . Und auch ohne ein modulares Projekt können wir unsere Java-Installation mit jlink effektiv in ein Verzeichnis klonen.
jlink --add-modules ALL-MODULE-PATH --output Build/Runtime
Durch die individuelle Einbindung jedes Moduls wird sichergestellt, dass Bibliotheken wie org.apache.commons/commons-text wie vorgesehen funktionieren. Wir müssen nur herausfinden, welche Module wir benötigen.

Schritt 3: Kombinieren Sie Jar und JRE zu einer ausführbaren Datei

Wenn Sie eine JAR-Datei haben, die den Code und alle seine Abhängigkeiten sowie die JRE enthält, müssen Sie sie nur noch kombinieren. Dazu müssen wir Folgendes tun:
  1. Komprimieren Sie das Verzeichnis mit der JRE und der JAR-Datei Ihrer Anwendung.
  2. Hängen Sie am Anfang dieser ZIP-Datei ein Stub-Skript an, das die Daten in ein temporäres Verzeichnis extrahiert und den Code ausführt.
Dafür gibt es eine JavaScript-Bibliothek namens caxa . Sein Zweck besteht darin, NodeJS-Projekte in ausführbare Dateien umzuwandeln, und es kann auch alle NodeJS-Installationen auf dem System bündeln. Glücklicherweise können Sie diesen Schritt überspringen, indem Sie das Flag --no-include-node angeben .
npx caxa \ --input build \ --output application \ --no-include-node \ -- ​​​​"{{caxa}}/runtime/bin/java" "-jar" "{{caxa}}/javaexe -1.0 .jar"
Dadurch wird eine ausführbare Datei mit dem Namen „application“ erstellt. Wenn Sie es für Windows erstellen, müssen Sie „application.exe“ angeben. Wenn die ausführbare Datei ausgeführt wird, wird {{caxa}} durch das temporäre Verzeichnis ersetzt, in dem die ZIP-Datei bereitgestellt wurde. Bitte beachten Sie, dass beim Erstellen ausführbarer Dateien auch Mechanismen wie Codesignatur und automatische Updates zum Einsatz kommen. Diese Dinge erfordern jedoch eine tiefergehende Untersuchung, die sich nur schwer in einer einzigen Veröffentlichung unterbringen lässt.
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION