JavaRush /Java Blog /Random-JA /コーヒーブレイク#148。Java プログラムをスタンドアロン EXE ファイルに変換する方法

コーヒーブレイク#148。Java プログラムをスタンドアロン EXE ファイルに変換する方法

Random-JA グループに公開済み
出典: Mccue.dev 今日は、Windows オペレーティング システムで実行する Java プログラムから実行可能 EXE ファイルを作成する方法を学びます。 コーヒーブレイク#148。 Java プログラムをスタンドアロン EXE ファイルに変換する方法 - 1ダブルクリックして起動するのは、プログラムを開く最も簡単な方法の 1 つです。アプリケーションを見せたい人がすでに正しいバージョンの Java をインストールしている場合は、jar ファイルをダブルクリックして実行できます。Java がインストールされていない場合は、jpackageなどの実行可能インストーラーを作成する方法があります。その後、コードを実行するには、このインストーラーをクリックするだけです。ネイティブ イメージを使用して、追加のインストールを必要としない実行可能ファイルにコードを変換することもできます。この記事では、どのような依存関係が含まれているか、どのような JVM 機能が使用されているかに関係なく、あらゆるアプリケーションで機能する非常にシンプルなアプローチに焦点を当てます。今日説明するコードはGitHub リポジトリにあり、プログラムの実行可能ファイルはここに掲載されています。

使用スタック

Java 9+

java --version jlink --version

メイビン

mvn --version

NodeJS

npx --バージョン

ステップ 1: コードをコンパイルして jar にパッケージ化する

この基本的なプログラムは、インターフェイス内のボタンの 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。 Java プログラムをスタンドアロン EXE ファイルに変換する方法 - 2現時点での目標は、コードとその依存関係を jar にパッケージ化することです。JAR ファイルは、余分な構造がほとんどない通常の ZIP アーカイブです。Mavenプロジェクトの場合、構成は次のようになります。
<?xml version="1.0"coding="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> <dependency> <dependency> <groupId> org.apache.commons</groupId> <artifactId>commons-text</artifactId> <version>1.9</version> </dependency> </dependency> <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> <transformerimplementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <manifestEntries> <Main-Class>example.Main</Main-クラス> <ビルド番号>1.0</ビルド番号> </manifestEntries> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build> </プロジェクト>
ここで、「シェード」プラグインは、すべての依存関係からのコードを jar に含めることを処理します。この場合、外部依存関係はorg.apache.commons/commons-textのみです。
mvnクリーンパッケージ
次に、この jar ファイルを新しいtarget/ディレクトリに移動し、他のファイルから分離します。
mkdir ビルド mv ターゲット/javaexe-1.0.jar ビルド

ステップ 2: Java ランタイム環境 (JRE) を作成する

作成済みの jar ファイルを実行するには、それを Java ランタイム環境にリンクする必要があります。このために、 jlink を使用します。Java エコシステムはモジュールを使用しないため、モジュールについて聞いたことも、jlink を使用したこともおそらくないでしょう。つまり、jlink は「カスタム実行可能イメージ」を作成できます。たとえば、Web サーバーを作成しているとします。AWT や Swing は必要ないため、コードにこれらを含めることは冗長になります。jlink を使用すると、 java.desktopモジュールをまったく含まない JRE を作成できます。このシステムは、アプリケーションとそのすべての依存関係にコンパイル済みのmodule-info.javaファイルが含まれている場合に最適に機能します。このファイルは、含めるモジュールを jlink に正確に伝えます。jdepsを使用して、必要なモジュールのリストを手動で定義することもできます。また、モジュール型プロジェクトがなくても、jlink を使用して Java インストールをディレクトリに効果的に複製できます。
jlink --add-modules ALL-MODULE-PATH --output ビルド/ランタイム
各モジュールを個別に含めることで、 org.apache.commons/commons-text などのライブラリが意図したとおりに動作することが保証されます。どのモジュールが必要かを理解する必要があるだけです。

ステップ 3: Jar と JRE を結合して実行可能ファイルにする

コードとそのすべての依存関係、および JRE を含む jar ファイルがあれば、あとはそれらを結合するだけです。これを行うには、次のことを行う必要があります。
  1. アプリケーションの JRE と jar を含むディレクトリを zip 圧縮します。
  2. この zip ファイルの先頭にスタブ スクリプトを添付します。これにより、データが一時ディレクトリに抽出され、コードが実行されます。
これには、 caxaと呼ばれる JavaScript ライブラリがあります。その目的は、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」という名前の実行可能ファイルが作成されます。Windows 用に作成する場合は、「application.exe」を指定する必要があります。実行可能ファイルが実行されると、{{caxa}} は zip ファイルがデプロイされた一時ディレクトリに置き換えられます。実行可能ファイルを作成する際には、コード署名や自動更新などのメカニズムも使用されることに注意してください。ただし、これらについてはさらに深い研究が必要であり、1 つの出版物に収めるのは困難です。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION