web-dev-qa-db-ja.com

Java 11で非モジュラー依存関係を持つアプリをパッケージ化する方法

ApacheBatikとJavaCVを使用するJavaSwingアプリを開発して配布しています。 Java 1.6、7、8で更新しました。macOS、Windows、LinuxのインストーラーはJavapackagerで構築されています。 Java 8は19年1月にサポートが終了し、新しいLTSバージョンであるJava11でパッケージ化して配布するソリューションが見つかりません。

JavaCVもBatikもモジュラーjarを生成しませんが、Java 11で実行可能なjarをコンパイルして生成できるように再パッケージ化できました。アプリは正常に動作しますが、配布用にパッケージ化できません。 javapackagerを使用してそこから11ランタイムをバンドルするためにJava 10にドロップすることを計画していましたが、jlinkを使用してカスタムランタイムを生成します。JavaCVとBatikがモジュール式ではないため、jlinkは失敗します。 jdepsは、BatikとJavaCVでの参照が満たされていないため、パッチを適用してモジュール化するmodule-info.classを生成しません。これがなくても、アプリは正常に動作します。

その結果、コードベースをJava 8のままにして、サポートされなくなったとしても出荷する必要があります。

Javapackagerの代わりを作成するための呼び出しがあることは知っていますが、それはJava8が非推奨になるまでありません。また、モジュラーjarをリファクタリングしてビルドし、カスタムランタイムを作成するには、BatikプロジェクトとJavaCVプロジェクトが必要です。

誰か他の解決策を提供できますか?私は何かを逃したことがありますか?ありがとう。

6
Hamish258

私は同じ問題を抱えています。 JDK 11を使用したかったのですが、 JDK-821278によると、JEP 343はJDK 13に予定されているので、もう少し待つ必要があります。 「ネイティブ」の自己完結型アプリケーションをJava 8-10でパッケージ化することは、パッケージャーが(少なくともOracle JDKに)含まれているため、問題ではありませんでした。

今日、私は このメール について知り、試してみたいと思いました。私のサンプルプロジェクトは github.com/skymatic/javafx11-test で見ることができます。これは、JDK開発ブランチからバックポートされたjpackagerを使用して正常にパッケージ化されました。

私がここでしたこと:

  • OpenJDK11とOpenJFX11を使用して新しいHelloWorldプロジェクトを作成しました。
  • パッケージャをダウンロードし、Mavenビルドから呼び出します(JDKと一緒に常駐する必要があり、動作させるにはJava_HOMEを設定する必要があることに注意してください...)
  • ボーナス:jdepsを使用して非モジュラーjarの依存関係を見つけ、--add-modulesパラメーターを設定してより小さなランタイムイメージを生成しました

もちろん、モジュラープロジェクトの場合はさらに簡単です。 このサンプルプロジェクトへのコミット では、クラスパスとメインの代わりに、モジュールパスとメインモジュールにjpackagerのパラメーターを使用したことがわかります。クラス。

5
Sebastian S

したがって、唯一の解決策は、ProcessBuilderを使用して元のアプリのjarを起動するラッパーアプリを作成することでした。

これの利点は、リンクを使用して必要最小限のランタイムを生成できることです。 jarをbinディレクトリに配置し、FPM( https://github.com/jordansissel/fpm )を使用してインストーラーを作成します。

ラッパーのサンプルコード

package xyz.arwhite.dslauncher;

import Java.io.File;
import Java.io.IOException;
import Java.util.ArrayList;
import Java.util.List;

public class DrumScoreLauncher {

    public static void main(String[] args) {
        String installHome = System.getProperty("Java.home");
        String installBin = installHome + File.separator + "bin" + File.separator;

        System.out.println("Launching Drum Score Editor from "+installHome);

        List<String> cmdLine = new ArrayList<String>();
        cmdLine.add(installBin + "Java");
        cmdLine.add("-jar");
        cmdLine.add(installBin + "DrumScoreEditor.jar");

        for ( int i = 0; i < args.length; i++ )
            cmdLine.add(args[i]);

        try {
            ProcessBuilder p = new ProcessBuilder(cmdLine);
            p.inheritIO();
            p.start();

        } catch (IOException e) {
            e.printStackTrace();
        }

        System.out.println("Exiting launcher");
    }

}
0
Hamish258