JavaRush /Blog Java /Random-PL /Przerwa kawowa #148. Jak zamienić dowolny program Java w ...

Przerwa kawowa #148. Jak zamienić dowolny program Java w samodzielny plik EXE

Opublikowano w grupie Random-PL
Źródło: Mccue.dev Dzisiaj dowiesz się, jak utworzyć plik wykonywalny EXE z programu Java, aby działał w systemie operacyjnym Windows. Przerwa kawowa #148.  Jak zamienić dowolny program Java w samodzielny plik EXE - 1Dwukrotne kliknięcie w celu uruchomienia to jeden z najłatwiejszych sposobów otwarcia programu. Jeśli osoba, której chcesz pokazać swoją aplikację, ma już zainstalowaną poprawną wersję Java, może dwukrotnie kliknąć plik jar, aby ją uruchomić. Jeśli nie ma zainstalowanej Java, istnieją sposoby na utworzenie wykonywalnego instalatora, takiego jak jpackage . Następnie, aby uruchomić kod, wystarczy kliknąć ten instalator. Możesz także użyć obrazu natywnego , aby zamienić kod w plik wykonywalny, który nie wymaga żadnej dodatkowej instalacji. W tym artykule skupimy się na dość prostym podejściu, które działa w przypadku każdej aplikacji, niezależnie od uwzględnionych zależności i używanych funkcji JVM. Kod, który dzisiaj omówimy, znajdziecie w repozytorium GitHub , a pliki wykonywalne z programem zamieszczono tutaj .

Stos używany

Java 9+

java --wersja jlink --wersja

Mavena

mvn – wersja

WęzełJS

npx --wersja

Krok 1: Skompiluj i spakuj kod w słoiku

Ten podstawowy program utworzy proste okno z tekstem, który możesz zmienić, klikając jeden z przycisków w interfejsie.
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);
    }
}
Przerwa kawowa #148.  Jak zamienić dowolny program Java w samodzielny plik EXE - 2Naszym celem jest teraz spakowanie kodu wraz z jego zależnościami do słoika. Pliki JAR to zwykłe archiwa ZIP z niewielką dodatkową strukturą. W przypadku projektu Maven konfiguracja będzie wyglądać następująco.
<?xml wersja="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>przykład</groupId> <artifactId>javaexe</artifactId> <version>1.0</version> <właściwości> <project.build.sourceEncoding>UTF-8</project .build.sourceEncoding> <maven.compiler.source>18</maven.compiler.source> <maven.compiler.target>18</maven.compiler.target> </properties> <zależności> <zależność> <groupId> org.apache.commons</groupId> <artifactId>commons-text</artifactId> <version>1.9</version> </dependentency> </ zależność> <build> <plugins> <plugin> <groupId>org.apache .maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>2.4.3</version> <executions> <execution> <phase>pakiet</phase> <goals> <goal> shade</goal> </goals> <configuration> <transformers> <transformer Implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <manifestEntries> <Main-Class>example.Main</Main- Klasa> <Numer kompilacji>1.0</Number kompilacji> </manifestEntries> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build> </projekt>
Tutaj wtyczka „shade” zajmie się dołączeniem kodu ze wszystkich zależności do słoika. W tym przypadku jedyną zależnością zewnętrzną jest org.apache.commons/commons-text .
mvn czysty pakiet
Następnie przeniesiemy ten plik jar do nowego katalogu docelowego/ , gdzie zostanie oddzielony od innych plików.
kompilacja mkdir kompilacja mv target/javaexe-1.0.jar

Krok 2: Utwórz środowisko wykonawcze Java (JRE)

Aby uruchomić utworzony już plik jar, musimy połączyć go ze środowiskiem wykonawczym Java. W tym celu użyjemy jlink . Ponieważ ekosystem Java nie korzysta z modułów, prawdopodobnie o nich nie słyszałeś ani nie korzystałeś z jlink. Krótko mówiąc, jlink może tworzyć „niestandardowe obrazy wykonywalne”. Na przykład tworzysz serwer WWW. Nie potrzebujesz AWT ani Swing, więc włączenie ich do kodu będzie zbędne. Za pomocą jlink możesz utworzyć środowisko JRE, które w ogóle nie zawiera modułu java.desktop . Ten system działa najlepiej, jeśli Twoja aplikacja i wszystkie jej zależności zawierają skompilowane pliki module-info.java , które informują jlink dokładnie, jakie moduły chcesz dołączyć. Możesz także ręcznie zdefiniować listę wymaganych modułów za pomocą jdeps . Nawet bez projektu modułowego możemy skutecznie sklonować naszą instalację Java do katalogu za pomocą jlink.
jlink --add-modules ŚCIEŻKA-WSZYSTKICH MODUŁÓW --wyjście kompilacji/środowiska wykonawczego
Dołączenie każdego modułu z osobna gwarantuje, że biblioteki takie jak org.apache.commons/commons-text będą działać zgodnie z oczekiwaniami. Musimy tylko dowiedzieć się, jakich modułów potrzebujemy.

Krok 3: Połącz Jar i JRE w plik wykonywalny

Mając plik jar zawierający kod i wszystkie jego zależności, a także środowisko JRE, pozostaje tylko je połączyć. Aby to zrobić, musimy wykonać następujące czynności:
  1. Spakuj katalog zawierający środowisko JRE i jar aplikacji.
  2. Dołącz skrypt pośredniczący na górze tego pliku ZIP, który wyodrębni dane do katalogu tymczasowego i uruchomi kod.
Istnieje do tego biblioteka JavaScript o nazwie caxa . Jego celem jest przekształcanie projektów NodeJS w pliki wykonywalne, a także może łączyć dowolne instalacje NodeJS w systemie. Na szczęście możesz pominąć ten krok, określając flagę --no-include-node .
npx caxa \ --input build \ --output application \ --no-include-node \ -- ​​​​"{{caxa}}/runtime/bin/java" "-jar" "{{caxa}}/javaexe -1,0 .słoik"
Spowoduje to utworzenie pliku wykonywalnego o nazwie „aplikacja”. Jeśli tworzysz go dla systemu Windows, musisz określić „application.exe”. Po uruchomieniu pliku wykonywalnego {{caxa}} zostanie zastąpiony katalogiem tymczasowym, w którym wdrożono plik zip. Należy pamiętać, że podczas tworzenia plików wykonywalnych wykorzystywane są również mechanizmy takie jak podpisywanie kodu i automatyczne aktualizacje. Sprawy te wymagają jednak głębszego przestudiowania, które trudno zmieścić w jednej publikacji.
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION