JavaRush /Java Blog /Random-IT /Pausa caffè #148. Come trasformare qualsiasi programma Ja...

Pausa caffè #148. Come trasformare qualsiasi programma Java in un file EXE autonomo

Pubblicato nel gruppo Random-IT
Fonte: Mccue.dev Oggi imparerai come creare un file EXE eseguibile da un programma Java per eseguirlo sul sistema operativo Windows. Pausa caffè #148.  Come trasformare qualsiasi programma Java in un file EXE autonomo - 1Fare doppio clic per avviare è uno dei modi più semplici per aprire un programma. Se la persona a cui desideri mostrare la tua applicazione ha già installata la versione corretta di Java, può fare doppio clic sul file jar per eseguirlo. Se non è installato Java, ci sono modi per creare un programma di installazione eseguibile, come jpackage . Successivamente, per eseguire il codice devi solo fare clic su questo programma di installazione. Puoi anche utilizzare Native Image per trasformare il codice in un file eseguibile che non richiede alcuna installazione aggiuntiva. In questo articolo ci concentreremo su un approccio abbastanza semplice che funziona per qualsiasi applicazione, indipendentemente dalle dipendenze incluse o dalle funzionalità JVM utilizzate. Il codice di cui parleremo oggi può essere trovato nel repository GitHub e i file eseguibili con il programma sono pubblicati qui .

Pila usata

Java9+

java --version jlink --version

Esperto di

mvn --version

NodoJS

npx --version

Passaggio 1: compila e impacchetta il tuo codice in un jar

Questo programma di base creerà una semplice finestra con testo che potrai modificare facendo clic su uno dei pulsanti dell'interfaccia.
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);
    }
}
Pausa caffè #148.  Come trasformare qualsiasi programma Java in un file EXE autonomo - 2Il nostro obiettivo ora è impacchettare il codice insieme alle sue dipendenze in un jar. I file JAR sono normali archivi ZIP con poca struttura aggiuntiva. Per un progetto Maven la configurazione sarà simile a questa.
<?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>esempio</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> <dipendenze> <dipendenza> <groupId> org.apache.commons</groupId> <artifactId>testo-commons</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>pacchetto</phase> <goals> <goal> shade</goal> </goals> <configuration> <transformers> <transformer implement="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <manifestEntries> <Main-Class>esempio.Main</Main- Classe> <Numero build>1.0</Numero build> </manifestEntries> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build> </progetto>
Qui il plugin "shade" gestirà l'inclusione del codice da tutte le tue dipendenze nel jar. In questo caso, l'unica dipendenza esterna è org.apache.commons/commons-text .
pacchetto mvn pulito
Sposteremo quindi questo file jar in una nuova directory target/ dove sarà separato dagli altri file.
mkdir build mv target/javaexe-1.0.jar build

Passaggio 2: creare un Java Runtime Environment (JRE)

Per eseguire il file jar che abbiamo già creato, dobbiamo collegarlo all'ambiente runtime Java. Per questo useremo jlink . Poiché l'ecosistema Java non utilizza moduli, probabilmente non ne hai sentito parlare o non hai utilizzato jlink. In breve, jlink può creare “immagini eseguibili personalizzate”. Ad esempio, stai creando un server web. Non hai bisogno di AWT o Swing, quindi includerli nel tuo codice sarà ridondante. Con jlink puoi creare un JRE che non includa affatto il modulo java.desktop . Questo sistema funziona meglio se la tua applicazione e tutte le sue dipendenze includono file module-info.java compilati , che indicano a jlink esattamente quali moduli desideri includere. Puoi anche definire manualmente l'elenco dei moduli richiesti utilizzando jdeps . E anche senza un progetto modulare, possiamo clonare efficacemente la nostra installazione Java in una directory utilizzando jlink.
jlink --add-modules ALL-MODULE-PATH --output build/runtime
Includere ciascun modulo individualmente garantisce che le librerie come org.apache.commons/commons-text funzioneranno come previsto. Dobbiamo solo capire di quali moduli abbiamo bisogno.

Passaggio 3: combinare Jar e JRE in un eseguibile

Avendo un file jar contenente il codice e tutte le sue dipendenze, oltre al JRE, non resta che combinarli. Per fare ciò dobbiamo fare quanto segue:
  1. Comprimi la directory contenente JRE e jar della tua applicazione.
  2. Allega uno script stub all'inizio di questo file zip, che estrarrà i dati in una directory temporanea ed eseguirà il codice.
Esiste una libreria JavaScript per questo chiamata caxa . Il suo scopo è trasformare i progetti NodeJS in eseguibili e può anche raggruppare qualsiasi installazione NodeJS sul sistema. Fortunatamente, puoi saltare questo passaggio specificando il flag --no-include-node .
npx caxa \ --input build \ --output application \ --no-include-node \ -- ​​​​"{{caxa}}/runtime/bin/java" "-jar" "{{caxa}}/javaexe -1.0 .jar"
Questo creerà un file eseguibile denominato "applicazione". Se lo stai creando per Windows, devi specificare "application.exe". Quando l'eseguibile viene eseguito, {{caxa}} verrà sostituito con la directory temporanea in cui è stato distribuito il file zip. Tieni presente che durante la creazione di file eseguibili vengono utilizzati anche meccanismi come la firma del codice e gli aggiornamenti automatici. Tuttavia, queste cose richiedono uno studio più approfondito, che è difficile da inserire in un’unica pubblicazione.
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION