منبع: Mccue.dev امروز یاد خواهید گرفت که چگونه یک فایل EXE اجرایی از یک برنامه جاوا ایجاد کنید تا در سیستم عامل ویندوز اجرا شود. دوبار کلیک کردن برای راه اندازی یکی از ساده ترین راه ها برای باز کردن یک برنامه است. اگر شخصی که میخواهید برنامه خود را به او نشان دهید قبلاً نسخه صحیح جاوا را نصب کرده است، میتواند روی فایل jar دوبار کلیک کند تا آن را اجرا کند. اگر جاوا نصب نشده باشد، راه هایی برای ایجاد یک نصب کننده اجرایی مانند jpackage وجود دارد . پس از آن، برای اجرای کد کافی است روی این نصب کننده کلیک کنید. همچنین می توانید از Native Image برای تبدیل کد به یک فایل اجرایی که نیازی به نصب اضافی ندارد استفاده کنید. در این مقاله، ما بر روی یک رویکرد نسبتاً ساده تمرکز میکنیم که برای هر برنامهای کار میکند، صرف نظر از اینکه چه وابستگیهایی را شامل میکنید یا از چه ویژگیهای JVM استفاده میکنید. کدی که امروز مورد بحث قرار خواهد گرفت را می توان در مخزن GitHub پیدا کرد و فایل های اجرایی با برنامه در اینجا پست می شوند .
پشته استفاده می شود
جاوا 9+
جاوا --نسخه jlink --نسخه
ماون
mvn -- نسخه
NodeJS
npx --نسخه
مرحله 1: کد خود را کامپایل و در یک شیشه بسته بندی کنید
این برنامه پایه یک پنجره ساده با متن ایجاد می کند که می توانید با کلیک بر روی یکی از دکمه های رابط کاربری آن را تغییر دهید.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);
}
}
هدف ما اکنون این است که کد را به همراه وابستگی های آن در یک jar بسته بندی کنیم. فایلهای JAR بایگانیهای ZIP معمولی هستند که ساختار اضافی کمی دارند. برای پروژه Maven پیکربندی به این صورت خواهد بود.
<?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>مثال</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>بسته</phase> <goals> <goal> سایه</goal> </goals> <configuration> <transformers> <transformer implement="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <manifestEntries> <Main-Class>example.Main</Main- Class> <Build-Number>1.0</Build-Number> </manifestEntries> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>
در اینجا پلاگین "shade" شامل کد از تمام وابستگیهای شما به jar میشود. در این مورد، تنها وابستگی خارجی org.apache.commons/commons-text است .
پکیج تمیز mvn
سپس این فایل jar را به یک فهرست هدف/ دایرکتوری جدید منتقل می کنیم که در آنجا از فایل های دیگر جدا می شود.
mkdir build mv target/javaexe-1.0.jar build
مرحله 2: ایجاد یک محیط زمان اجرا جاوا (JRE)
برای اجرای فایل jar که از قبل ایجاد کرده ایم، باید آن را با محیط اجرای جاوا پیوند دهیم. برای این کار از jlink استفاده می کنیم . از آنجایی که اکوسیستم جاوا از ماژول ها استفاده نمی کند، احتمالاً نام آنها را نشنیده اید یا از jlink استفاده نکرده اید. به طور خلاصه، jlink می تواند "تصاویر اجرایی سفارشی" ایجاد کند. به عنوان مثال، شما در حال ساخت یک وب سرور هستید. شما به AWT یا Swing نیاز ندارید، بنابراین گنجاندن آنها در کد شما اضافی خواهد بود. با jlink می توانید یک JRE ایجاد کنید که اصلاً شامل ماژول java.desktop نباشد . اگر برنامه شما و همه وابستگیهای آن شامل فایلهای کامپایلشده module-info.java باشد که به jlink میگوید دقیقاً چه ماژولهایی را میخواهید بگنجانید، این سیستم بهترین عملکرد را دارد. همچنین می توانید به صورت دستی لیست ماژول های مورد نیاز را با استفاده از jdeps تعریف کنید . و حتی بدون پروژه ماژولار، میتوانیم به طور موثری نصب جاوا خود را با استفاده از jlink در فهرستی شبیهسازی کنیم.
jlink --add-modules ALL-MODULE-PATH --خروجی ساخت/زمان اجرا
گنجاندن هر ماژول به صورت جداگانه تضمین می کند که کتابخانه هایی مانند org.apache.commons/commons-text همانطور که در نظر گرفته شده است کار خواهند کرد. فقط باید بفهمیم به کدام ماژول نیاز داریم.
مرحله 3: Jar و JRE را در یک فایل اجرایی ترکیب کنید
با داشتن یک فایل jar حاوی کد و تمام وابستگی های آن و همچنین JRE، تنها چیزی که باقی می ماند ترکیب آنهاست. برای انجام این کار باید موارد زیر را انجام دهیم:- دایرکتوری حاوی JRE و jar برنامه شما را زیپ کنید.
- یک اسکریپت خرد را به بالای این فایل فشرده ضمیمه کنید، که داده ها را در یک پوشه موقت استخراج کرده و کد را اجرا می کند.
npx caxa \ --input build \ --output application \ --no-include-node \ -- "{{caxa}}/runtime/bin/java" "-jar" "{{caxa}}/javaexe -1.0 .jar"
با این کار یک فایل اجرایی به نام "application" ایجاد می شود. اگر آن را برای ویندوز ایجاد می کنید، باید "application.exe" را مشخص کنید. هنگامی که فایل اجرایی اجرا می شود، {{caxa}} با دایرکتوری موقتی که فایل zip در آن مستقر شده است جایگزین می شود. لطفاً توجه داشته باشید که هنگام ایجاد فایل های اجرایی از مکانیسم هایی مانند امضای کد و به روز رسانی خودکار نیز استفاده می شود. با این حال، این موارد نیاز به مطالعه عمیق تری دارند، که به سختی می توان آن را در یک نشریه جا داد.
GO TO FULL VERSION