Źródło: Mccue.dev Dzisiaj dowiesz się, jak utworzyć plik wykonywalny EXE z programu Java, aby działał w systemie operacyjnym Windows. Dwukrotne 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);
}
}
Naszym 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:- Spakuj katalog zawierający środowisko JRE i jar aplikacji.
- Dołącz skrypt pośredniczący na górze tego pliku ZIP, który wyodrębni dane do katalogu tymczasowego i uruchomi kod.
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.
GO TO FULL VERSION