JavaRush /Blog Java /Random-ES /Pausa para el café #148. Cómo convertir cualquier program...

Pausa para el café #148. Cómo convertir cualquier programa Java en un archivo EXE independiente

Publicado en el grupo Random-ES
Fuente: Mccue.dev Hoy aprenderá cómo crear un archivo EXE ejecutable a partir de un programa Java para ejecutarlo en el sistema operativo Windows. Pausa para el café #148.  Cómo convertir cualquier programa Java en un archivo EXE independiente - 1Hacer doble clic para iniciar es una de las formas más sencillas de abrir un programa. Si la persona a la que desea mostrarle su aplicación ya tiene instalada la versión correcta de Java, puede hacer doble clic en el archivo jar para ejecutarlo. Si no tiene Java instalado, existen formas de crear un instalador ejecutable, como jpackage . Después de eso, para ejecutar el código sólo necesita hacer clic en este instalador. También puedes utilizar Native Image para convertir el código en un archivo ejecutable que no requiera ninguna instalación adicional. En este artículo, nos centraremos en un enfoque bastante simple que funciona para cualquier aplicación, sin importar qué dependencias incluya o qué características de JVM utilice. El código que se discutirá hoy se puede encontrar en el repositorio de GitHub y los archivos ejecutables con el programa se publican aquí .

pila usada

Java 9+

java --versión jlink --versión

experto

mvn --versión

NodoJS

npx --versión

Paso 1: compila y empaqueta tu código en un jar

Este programa básico creará una ventana simple con texto que podrás cambiar haciendo clic en uno de los botones de la interfaz.
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 para el café #148.  Cómo convertir cualquier programa Java en un archivo EXE independiente - 2Nuestro objetivo ahora es empaquetar el código junto con sus dependencias en un frasco. Los archivos JAR son archivos ZIP normales con poca estructura adicional. Para un proyecto Maven , la configuración se verá así.
<?xml versión="1.0" codificación="UTF-8"?> <proyecto 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>ejemplo</groupId> <artifactId>javaexe</artifactId> <versión>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> <dependencias> <dependencia> <groupId> org.apache.commons</groupId> <artifactId>commons-text</artifactId> <versión>1.9</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache .maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <versión>2.4.3</versión> <ejecuciones> <ejecución> <fase>paquete</fase> <objetivos> <objetivo> sombra</goal> </goals> <configuración> <transformadores> <transformer implementación="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <manifestEntries> <Main-Class>ejemplo.Main</Main- Clase> <Build-Number>1.0</Build-Number> </manifestEntries> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build> </proyecto>
Aquí el complemento "sombra" se encargará de incluir el código de todas sus dependencias en el frasco. En este caso, la única dependencia externa es org.apache.commons/commons-text .
paquete limpio mvn
Luego moveremos este archivo jar a un nuevo directorio de destino/ donde se separará de otros archivos.
mkdir compilación mv target/javaexe-1.0.jar compilación

Paso 2: crear un entorno de ejecución de Java (JRE)

Para ejecutar el archivo jar que ya hemos creado, debemos vincularlo al entorno de ejecución de Java. Para esto usaremos jlink . Dado que el ecosistema Java no utiliza módulos, probablemente no haya oído hablar de ellos ni haya utilizado jlink. En resumen, jlink puede crear "imágenes ejecutables personalizadas". Por ejemplo, estás creando un servidor web. No necesita AWT ni Swing, por lo que incluirlos en su código será redundante. Con jlink puedes crear un JRE que no incluya el módulo java.desktop en absoluto . Este sistema funciona mejor si su aplicación y todas sus dependencias incluyen archivos module-info.java compilados , que le indican a jlink exactamente qué módulos desea incluir. También puede definir manualmente la lista de módulos requeridos usando jdeps . E incluso sin un proyecto modular, podemos clonar efectivamente nuestra instalación de Java en un directorio usando jlink.
jlink --add-modules ALL-MODULE-PATH --salida de compilación/tiempo de ejecución
Incluir cada módulo individualmente garantiza que bibliotecas como org.apache.commons/commons-text funcionen según lo previsto. Sólo tenemos que averiguar qué módulos necesitamos.

Paso 3: combine Jar y JRE en un ejecutable

Teniendo un archivo jar que contiene el código y todas sus dependencias, además del JRE, solo queda combinarlos. Para ello necesitamos hacer lo siguiente:
  1. Comprima el directorio que contiene el JRE y el jar de su aplicación.
  2. Adjunte un script de código auxiliar en la parte superior de este archivo zip, que extraerá los datos en un directorio temporal y ejecutará el código.
Hay una biblioteca de JavaScript para esto llamada caxa . Su propósito es convertir proyectos de NodeJS en ejecutables y también puede agrupar cualquier instalación de NodeJS en el sistema. Afortunadamente, puedes omitir este paso especificando la marca --no-include-node .
npx caxa \ --input build \ --output application \ --no-include-node \ -- ​​​​"{{caxa}}/runtime/bin/java" "-jar" "{{caxa}}/javaexe -1.0 .jar"
Esto creará un archivo ejecutable llamado "aplicación". Si lo está creando para Windows, debe especificar "application.exe". Cuando se ejecute el ejecutable, {{caxa}} será reemplazado con el directorio temporal donde se implementó el archivo zip. Tenga en cuenta que al crear archivos ejecutables también se utilizan mecanismos como la firma de código y las actualizaciones automáticas. Sin embargo, estas cosas requieren un estudio más profundo, que es difícil encajar en una sola publicación.
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION