Как упаковать приложение на Java 11 с немодулярными зависимостями - PullRequest
0 голосов
/ 30 ноября 2018

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 07 января 2019

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

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

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

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

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

0 голосов
/ 05 декабря 2018

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

}
...