Pinagmulan: Mccue.dev Ngayon ay matututunan mo kung paano lumikha ng isang executable EXE file mula sa isang Java program na tatakbo sa Windows operating system. Ang pag-double click upang ilunsad ay isa sa mga pinakamadaling paraan upang magbukas ng programa. Kung ang taong gusto mong ipakita ang iyong application ay mayroon nang tamang bersyon ng Java na naka-install, maaari nilang i-double click ang jar file upang patakbuhin ito. Kung wala itong naka-install na Java, may mga paraan para gumawa ng executable installer, gaya ng jpackage . Pagkatapos nito, upang patakbuhin ang code kailangan mo lamang mag-click sa installer na ito. Maaari mo ring gamitin ang Native Image upang gawing executable file ang code na hindi nangangailangan ng anumang karagdagang pag-install. Sa artikulong ito, tututuon kami sa isang medyo simpleng diskarte na gumagana para sa anumang application, anuman ang mga dependency na isasama mo o kung anong mga feature ng JVM ang ginagamit mo. Ang code na tatalakayin ngayon ay matatagpuan sa GitHub repository , at ang mga executable na file kasama ang program ay naka - post dito .
Salansan ang ginamit
Java 9+
java --bersyon jlink --bersyon
Maven
mvn --bersyon
NodeJS
npx --bersyon
Hakbang 1: I-compile at i-package ang iyong code sa isang garapon
Ang pangunahing program na ito ay lilikha ng isang simpleng window na may teksto na maaari mong baguhin sa pamamagitan ng pag-click sa isa sa mga pindutan sa 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);
}
}
Ang layunin namin ngayon ay i-package ang code kasama ang mga dependency nito sa isang garapon. Ang mga JAR file ay mga regular na ZIP archive na may kaunting dagdag na istraktura. Para sa isang proyekto ng Maven ang pagsasaayos ay magiging ganito.
<?xml version="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>example</groupId> <artifactId>javaexe</artifactId> <version>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>package</phase> <goals> <goal> shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <manifestEntries> <Main-Class>example.Main</Main- Klase> <Build-Number>1.0</Build-Number> </manifestEntries> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build> </proyekto>
Dito ang "shade" na plugin ay hahawak kasama ang code mula sa lahat ng iyong mga dependency sa garapon. Sa kasong ito, ang tanging panlabas na dependency ay org.apache.commons/commons-text .
mvn malinis na pakete
Pagkatapos ay ililipat namin ang jar file na ito sa isang bagong target/ direktoryo kung saan ito ihihiwalay sa iba pang mga file.
mkdir build mv target/javaexe-1.0.jar build
Hakbang 2: Lumikha ng Java Runtime Environment (JRE)
Upang patakbuhin ang jar file na nagawa na namin, kailangan naming i-link ito sa Java runtime environment. Para dito gagamitin namin ang jlink . Dahil ang Java ecosystem ay hindi gumagamit ng mga module, malamang na hindi mo pa naririnig ang mga ito o gumamit ng jlink. Sa madaling salita, maaaring lumikha ang jlink ng "mga custom na executable na larawan". Halimbawa, gumagawa ka ng isang web server. Hindi mo kailangan ng AWT o Swing, kaya magiging kalabisan ang pagsasama ng mga ito sa iyong code. Sa jlink maaari kang lumikha ng isang JRE na hindi kasama ang java.desktop module sa lahat . Pinakamahusay na gagana ang system na ito kung ang iyong application at lahat ng mga dependency nito ay kasama ang mga pinagsama-samang module-info.java file , na nagsasabi sa jlink nang eksakto kung anong mga module ang gusto mong isama. Maaari mo ring manu-manong tukuyin ang listahan ng mga kinakailangang module gamit ang jdeps . At kahit na walang modular na proyekto, epektibo naming mai-clone ang aming pag-install ng Java sa isang direktoryo gamit ang jlink.
jlink --add-modules ALL-MODULE-PATH --output build/runtime
Ang pagsasama ng bawat module nang paisa-isa ay nagsisiguro na ang mga aklatan tulad ng org.apache.commons/commons-text ay gagana ayon sa nilalayon. Kailangan lang nating malaman kung aling mga module ang kailangan natin.
Hakbang 3: Pagsamahin ang Jar at JRE sa isang executable
Ang pagkakaroon ng jar file na naglalaman ng code at lahat ng dependency nito, pati na rin ang JRE, ang natitira na lang ay pagsamahin ang mga ito. Upang gawin ito kailangan nating gawin ang sumusunod:- I-zip ang direktoryo na naglalaman ng JRE at jar ng iyong aplikasyon.
- Maglakip ng stub script sa tuktok ng zip file na ito, na kukuha ng data sa isang pansamantalang direktoryo at patakbuhin ang code.
npx caxa \ --input build \ --output application \ --no-include-node \ -- "{{caxa}}/runtime/bin/java" "-jar" "{{caxa}}/javaexe -1.0 .jar"
Gagawa ito ng executable file na pinangalanang "application". Kung nililikha mo ito para sa Windows, kailangan mong tukuyin ang "application.exe". Kapag tumakbo ang executable, ang {{caxa}} ay papalitan ng pansamantalang direktoryo kung saan na-deploy ang zip file. Pakitandaan na kapag gumagawa ng mga executable na file, ginagamit din ang mga mekanismo gaya ng code signing at awtomatikong pag-update. Gayunpaman, ang mga bagay na ito ay nangangailangan ng mas malalim na pag-aaral, na mahirap na magkasya sa isang publikasyon.
GO TO FULL VERSION