JavaRush /وبلاگ جاوا /Random-FA /کافه استراحت شماره 148. چگونه هر برنامه جاوا را به یک فای...

کافه استراحت شماره 148. چگونه هر برنامه جاوا را به یک فایل EXE مستقل تبدیل کنیم

در گروه منتشر شد
منبع: Mccue.dev امروز یاد خواهید گرفت که چگونه یک فایل EXE اجرایی از یک برنامه جاوا ایجاد کنید تا در سیستم عامل ویندوز اجرا شود. کافه استراحت شماره 148.  نحوه تبدیل هر برنامه جاوا به یک فایل EXE مستقل - 1دوبار کلیک کردن برای راه اندازی یکی از ساده ترین راه ها برای باز کردن یک برنامه است. اگر شخصی که می‌خواهید برنامه خود را به او نشان دهید قبلاً نسخه صحیح جاوا را نصب کرده است، می‌تواند روی فایل 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);
    }
}
کافه استراحت شماره 148.  نحوه تبدیل هر برنامه جاوا به یک فایل EXE مستقل - 2هدف ما اکنون این است که کد را به همراه وابستگی های آن در یک 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، تنها چیزی که باقی می ماند ترکیب آنهاست. برای انجام این کار باید موارد زیر را انجام دهیم:
  1. دایرکتوری حاوی JRE و jar برنامه شما را زیپ کنید.
  2. یک اسکریپت خرد را به بالای این فایل فشرده ضمیمه کنید، که داده ها را در یک پوشه موقت استخراج کرده و کد را اجرا می کند.
یک کتابخانه جاوا اسکریپت برای این کار وجود دارد که caxa نام دارد . هدف آن تبدیل پروژه های NodeJS به فایل های اجرایی است و همچنین می تواند هر گونه نصب NodeJS را در سیستم بسته بندی کند. خوشبختانه، می‌توانید این مرحله را با مشخص کردن پرچم --no-include-node رد کنید .
npx caxa \ --input build \ --output application \ --no-include-node \ -- ​​"{{caxa}}/runtime/bin/java" "-jar" "{{caxa}}/javaexe -1.0 .jar"
با این کار یک فایل اجرایی به نام "application" ایجاد می شود. اگر آن را برای ویندوز ایجاد می کنید، باید "application.exe" را مشخص کنید. هنگامی که فایل اجرایی اجرا می شود، {{caxa}} با دایرکتوری موقتی که فایل zip در آن مستقر شده است جایگزین می شود. لطفاً توجه داشته باشید که هنگام ایجاد فایل های اجرایی از مکانیسم هایی مانند امضای کد و به روز رسانی خودکار نیز استفاده می شود. با این حال، این موارد نیاز به مطالعه عمیق تری دارند، که به سختی می توان آن را در یک نشریه جا داد.
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION