Source : Mccue.dev Aujourd'hui, vous apprendrez à créer un fichier EXE exécutable à partir d'un programme Java à exécuter sur le système d'exploitation Windows. Pause café #148.  Comment transformer n'importe quel programme Java en un fichier EXE autonome - 1Double-cliquer pour lancer est l’un des moyens les plus simples d’ouvrir un programme. Si la personne à qui vous souhaitez montrer votre application a déjà installé la bonne version de Java, elle peut double-cliquer sur le fichier jar pour l'exécuter. Si Java n'est pas installé, il existe des moyens de créer un programme d'installation exécutable, tel que jpackage . Après cela, pour exécuter le code, il vous suffit de cliquer sur ce programme d'installation. Vous pouvez également utiliser Native Image pour transformer le code en un fichier exécutable qui ne nécessite aucune installation supplémentaire. Dans cet article, nous nous concentrerons sur une approche assez simple qui fonctionne pour n'importe quelle application, quelles que soient les dépendances que vous incluez ou les fonctionnalités JVM que vous utilisez. Le code qui sera discuté aujourd'hui se trouve dans le référentiel GitHub et les fichiers exécutables avec le programme sont publiés ici .

Pile utilisée

Java9+

java --version jlink --version

Maven

mvn --version

NoeudJS

npx --version

Étape 1 : Compilez et conditionnez votre code dans un fichier jar

Ce programme de base créera une simple fenêtre avec du texte que vous pourrez modifier en cliquant sur l'un des boutons de l'interface.
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);
    }
}
Pause café #148.  Comment transformer n'importe quel programme Java en un fichier EXE autonome - 2Notre objectif est maintenant de regrouper le code avec ses dépendances dans un fichier jar. Les fichiers JAR sont des archives ZIP classiques avec peu de structure supplémentaire. Pour un projet Maven , la configuration ressemblera à ceci.
<?xml version="1.0" encoding="UTF-8"?> <projet 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>exemple</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- Classe> <Build-Number>1.0</Build-Number> </manifestEntries> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build> </projet>
Ici, le plugin « shade » gérera l'inclusion du code de toutes vos dépendances dans le pot. Dans ce cas, la seule dépendance externe est org.apache.commons/commons-text .
paquet mvn propre
Nous déplacerons ensuite ce fichier jar vers un nouveau répertoire target/ où il sera séparé des autres fichiers.
mkdir construire mv target/javaexe-1.0.jar construire

Étape 2 : Créer un environnement d'exécution Java (JRE)

Pour exécuter le fichier jar que nous avons déjà créé, nous devons le lier à l'environnement d'exécution Java. Pour cela nous utiliserons jlink . Étant donné que l'écosystème Java n'utilise pas de modules, vous n'en avez probablement pas entendu parler ni utilisé jlink. En bref, jlink peut créer des « images exécutables personnalisées ». Par exemple, vous créez un serveur Web. Vous n'avez pas besoin d'AWT ou de Swing, donc les inclure dans votre code sera redondant. Avec jlink, vous pouvez créer un JRE qui n'inclut pas du tout le module java.desktop . Ce système fonctionne mieux si votre application et toutes ses dépendances incluent des fichiers module-info.java compilés , qui indiquent à jlink exactement les modules que vous souhaitez inclure. Vous pouvez également définir manuellement la liste des modules requis à l'aide de jdeps . Et même sans projet modulaire, nous pouvons cloner efficacement notre installation Java dans un répertoire à l'aide de jlink.
jlink --add-modules ALL-MODULE-PATH --output build/runtime
L'inclusion de chaque module individuellement garantit que les bibliothèques telles que org.apache.commons/commons-text fonctionneront comme prévu. Nous devons juste déterminer de quels modules nous avons besoin.

Étape 3 : Combinez Jar et JRE dans un exécutable

Disposant d'un fichier jar contenant le code et toutes ses dépendances, ainsi que le JRE, il ne reste plus qu'à les combiner. Pour ce faire, nous devons procéder comme suit :
  1. Zippez le répertoire contenant le JRE et le jar de votre application.
  2. Joignez un script stub en haut de ce fichier zip, qui extraira les données dans un répertoire temporaire et exécutera le code.
Il existe une bibliothèque JavaScript pour cela appelée caxa . Son objectif est de transformer les projets NodeJS en exécutables et il peut également regrouper toutes les installations NodeJS sur le système. Heureusement, vous pouvez ignorer cette étape en spécifiant l' indicateur --no-include-node .
npx caxa \ --input build \ --output application \ --no-include-node \ -- ​​​​"{{caxa}}/runtime/bin/java" "-jar" "{{caxa}}/javaexe -1.0 .jar"
Cela créera un fichier exécutable nommé « application ». Si vous le créez pour Windows, vous devez spécifier « application.exe ». Lorsque l'exécutable s'exécute, {{caxa}} sera remplacé par le répertoire temporaire dans lequel le fichier zip a été déployé. Veuillez noter que lors de la création de fichiers exécutables, des mécanismes tels que la signature de code et les mises à jour automatiques sont également utilisés. Cependant, ces questions nécessitent une étude plus approfondie, difficile à intégrer dans une seule publication.