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プロジェクトが必要です。
誰か他の解決策を提供できますか?私は何かを逃したことがありますか?ありがとう。
私は同じ問題を抱えています。 JDK 11を使用したかったのですが、 JDK-821278によると、JEP 343はJDK 13に予定されているので、もう少し待つ必要があります。 「ネイティブ」の自己完結型アプリケーションをJava 8-10でパッケージ化することは、パッケージャーが(少なくともOracle JDKに)含まれているため、問題ではありませんでした。
今日、私は このメール について知り、試してみたいと思いました。私のサンプルプロジェクトは github.com/skymatic/javafx11-test で見ることができます。これは、JDK開発ブランチからバックポートされたjpackager
を使用して正常にパッケージ化されました。
私がここでしたこと:
Java_HOME
を設定する必要があることに注意してください...)jdeps
を使用して非モジュラーjarの依存関係を見つけ、--add-modules
パラメーターを設定してより小さなランタイムイメージを生成しましたもちろん、モジュラープロジェクトの場合はさらに簡単です。 このサンプルプロジェクトへのコミット では、クラスパスとメインの代わりに、モジュールパスとメインモジュールにjpackager
のパラメーターを使用したことがわかります。クラス。
したがって、唯一の解決策は、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");
}
}