JavaRush /Blogue Java /Random-PT /Pausa para café #148. Como transformar qualquer programa ...

Pausa para café #148. Como transformar qualquer programa Java em um arquivo EXE independente

Publicado no grupo Random-PT
Fonte: Mccue.dev Hoje você aprenderá como criar um arquivo EXE executável a partir de um programa Java para rodar no sistema operacional Windows. Pausa para café #148.  Como transformar qualquer programa Java em um arquivo EXE independente - 1Clicar duas vezes para iniciar é uma das maneiras mais fáceis de abrir um programa. Se a pessoa para quem você deseja mostrar seu aplicativo já tiver a versão correta do Java instalada, ela poderá clicar duas vezes no arquivo jar para executá-lo. Caso não tenha o Java instalado, existem maneiras de criar um instalador executável, como o jpackage . Depois disso, para executar o código basta clicar neste instalador. Você também pode usar Native Image para transformar o código em um arquivo executável que não requer instalação adicional. Neste artigo, vamos nos concentrar em uma abordagem bastante simples que funciona para qualquer aplicativo, independentemente das dependências incluídas ou dos recursos da JVM usados. O código que será discutido hoje pode ser encontrado no repositório GitHub , e os arquivos executáveis ​​com o programa estão postados aqui .

Pilha usada

Java 9+

java --versão jlink --versão

Maven

mvn --versão

NodeJS

npx --versão

Etapa 1: compilar e empacotar seu código em um jar

Este programa básico criará uma janela simples com texto que você pode alterar clicando em um dos botões da 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);
    }
}
Pausa para café #148.  Como transformar qualquer programa Java em um arquivo EXE independente - 2Nosso objetivo agora é empacotar o código junto com suas dependências em um jar. Os arquivos JAR são arquivos ZIP regulares com pouca estrutura extra. Para um projeto Maven , a configuração será semelhante a esta.
<?xml version="1.0" encoding="UTF-8"?> <projeto 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>exemplo</groupId> <artifactId>javaexe</artifactId> <versão>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>pacote</phase> <goals> <goal> sombra</goal> </goals> <configuration> <transformers> <transformer implementação="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> </projeto>
Aqui, o plugin “shade” irá lidar com a inclusão do código de todas as suas dependências no jar. Neste caso, a única dependência externa é org.apache.commons/commons-text .
pacote limpo mvn
Em seguida, moveremos esse arquivo jar para um novo diretório target/ onde ele será separado de outros arquivos.
mkdir construir mv alvo/javaexe-1.0.jar construir

Etapa 2: Crie um Java Runtime Environment (JRE)

Para executar o arquivo jar que já criamos, precisamos vinculá-lo ao Java Runtime Environment. Para isso usaremos jlink . Como o ecossistema Java não usa módulos, você provavelmente nunca ouviu falar deles nem usou o jlink. Resumindo, o jlink pode criar “imagens executáveis ​​personalizadas”. Por exemplo, você está criando um servidor web. Você não precisa de AWT ou Swing, portanto incluí-los em seu código será redundante. Com o jlink você pode criar um JRE que não inclua o módulo java.desktop . Este sistema funciona melhor se seu aplicativo e todas as suas dependências incluírem arquivos module-info.java compilados , que informam ao jlink exatamente quais módulos você deseja incluir. Você também pode definir manualmente a lista de módulos necessários usando jdeps . E mesmo sem um projeto modular, podemos clonar efetivamente nossa instalação Java em um diretório usando jlink.
jlink --add-modules ALL-MODULE-PATH --output compilação/tempo de execução
A inclusão de cada módulo individualmente garante que bibliotecas como org.apache.commons/commons-text funcionarão conforme o esperado. Só precisamos descobrir quais módulos precisamos.

Etapa 3: Combine Jar e JRE em um executável

Tendo um arquivo jar contendo o código e todas as suas dependências, assim como o JRE, resta combiná-los. Para fazer isso, precisamos fazer o seguinte:
  1. Compacte o diretório que contém o JRE e o jar do seu aplicativo.
  2. Anexe um script stub ao topo deste arquivo zip, que extrairá os dados em um diretório temporário e executará o código.
Existe uma biblioteca JavaScript para isso chamada caxa . Seu objetivo é transformar projetos NodeJS em executáveis ​​e também pode agrupar qualquer instalação NodeJS no sistema. Felizmente, você pode pular esta etapa especificando o sinalizador --no-include-node .
npx caxa \ --input build \ --output application \ --no-include-node \ -- ​​​​"{{caxa}}/runtime/bin/java" "-jar" "{{caxa}}/javaexe -1.0.jar"
Isso criará um arquivo executável chamado “aplicativo”. Se você estiver criando para Windows, precisará especificar “application.exe”. Quando o executável for executado, {{caxa}} será substituído pelo diretório temporário onde o arquivo zip foi implantado. Observe que ao criar arquivos executáveis, mecanismos como assinatura de código e atualizações automáticas também são usados. No entanto, essas coisas exigem um estudo mais aprofundado, difícil de caber em uma publicação.
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION