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. Hacer 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);
}
}
Nuestro 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:- Comprima el directorio que contiene el JRE y el jar de su aplicación.
- 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.
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.
GO TO FULL VERSION