Как упаковать приложение на Java 11 с немодульными зависимостями

Я разрабатываю и распространяю приложение Java Swing, использующее Apache Batik и JavaCV. Я обновил его через java 1.6, 7 и 8. Установщики для macOS, Windows и Linux построены с помощью Javapackager. Поддержка Java 8 прекращается в январе 1919 года, и я не могу найти решение для упаковки и распространения в Java 11, новой версии LTS.

Ни JavaCV, ни Batik не производят модульные банки, но мне удалось переупаковать их до такой степени, что я могу скомпилировать и создать работающую банку на Java 11, приложение работает нормально, но я не могу упаковать его для распространения. Я планировал перейти на Java 10, чтобы использовать javapackager и связать оттуда среду выполнения 11, но он использует jlink для создания настраиваемой среды выполнения, jlink не работает, потому что JavaCV и Batik не являются модульными. jdeps не будет создавать module-info.class для внесения исправлений и делать их модульными из-за неудовлетворенных ссылок в Batik и JavaCV, хотя мое приложение отлично работает без них.

В результате мне придется оставить кодовую базу на Java 8 и отправить ее, даже если она больше не поддерживается.

Я знаю, что есть призыв создать замену javapackager, но этого не будет до тех пор, пока Java 8 не станет устаревшей. И мне по-прежнему нужны проекты Batik и JavaCV для рефакторинга и создания модульных jar-файлов для создания настраиваемой среды выполнения.

Может ли кто-нибудь предложить другое решение? Я что-то упустил? Спасибо.


person Hamish258    schedule 29.11.2018    source источник
comment
Я полагаю, что переход снизу вверх потребует времени - это то, что они действительно рассматривали, но они упустили возможность подробно обсудить сколько времени.   -  person Naman    schedule 30.11.2018
comment
Действительно, и не до тех пор, пока проекты, от которых я зависим, точно зависят.   -  person Hamish258    schedule 04.12.2018


Ответы (3)


Обновление: jpackage теперь включен, начиная с JDK 14. Однако следующий ответ все еще применим для более старых версий JDK.


У меня была такая же проблема. Я хотел использовать JDK 11, но согласно JDK-8212780 JEP 343 запланирован на JDK 13, поэтому нам нужно подождать еще немного. Упаковка собственных автономных приложений под Java 8–10 не представляла проблемы, поскольку упаковщик был включен (по крайней мере, в Oracle JDK).

Сегодня я узнал об этом письме и решил, что хочу попробовать: мой образец проекта можно увидеть на github. com / skymatic / javafx11-test, который я успешно упаковал с помощью перенесенного обратно jpackager из ветки разработки JDK.

Что я здесь сделал:

  • Создал новый проект HelloWorld с использованием OpenJDK 11 и OpenJFX 11.
  • Загрузите упаковщик и вызовите его из сборки Maven (обратите внимание, что он должен находиться в JDK, и вам нужно установить JAVA_HOME, чтобы он работал ...)
  • Бонус: я использовал jdeps, чтобы выяснить зависимость моего немодульного jar-файла, и установил параметр --add-modules для создания меньшего образа во время выполнения.

Конечно, для модульных проектов это еще проще: в этот коммит в мой пример проекта вы можете видеть, что я использовал параметры jpackager для пути к модулю и основного модуля вместо пути к классам и основного класса.

person Sebastian S    schedule 07.01.2019
comment
Спасибо! Мне нужно кое-что поработать здесь, так как я заново перепроектировал то, что делал, я сделал свое приложение немодульным, вручную собрал jre меньшего размера, как вы, используя jlink, а затем использовал упаковщик, чтобы собрать все это воедино. Реквизит ребятам, которые портировали jpackager на 11. - person Hamish258; 09.01.2019

Таким образом, единственным решением было написать приложение-оболочку, которое использует ProcessBuilder для запуска оригинального 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");
    }

}
person Hamish258    schedule 05.12.2018

Вот ссылка на шаблон GitHub, показывающий, как использовать jlink, jpackage и GitHub Actions для создания приложения JavaFX и собственных установщиков macOS, Windows и Linux с небольшой JVM:

https://github.com/wiverson/maven-jpackage-template

Вот версия (WIP), которая использует Swing и встроенный сервер Spring Boot:

https://github.com/wiverson/desktop-spring-boot

person Will Iverson    schedule 23.04.2021