Упаковка файла Jar для Mac и Windows без JRE в комплекте - PullRequest
0 голосов
/ 10 ноября 2018

Я встроил в IntelliJ IDEA мое приложение javaFX в виде файла jar .Используя « Структура проекта >> Артефакты >> + JavaFX Application », я могу собрать .app, .dmg, .pkg, .exe с включенным JRE.Но мне нужно собрать те же файлы без JRE в комплекте.Конечно, я могу использовать JAR, но я хочу сделать свой собственный значок и, возможно, установщик.

Я также пытался создать папку .app из jar , чтобы выполнить ее вручную " java-jar myJarName.jar", но если у меня несколько версий JDK - он всегда использует последнюю версию (JRE 11), которая не включает библиотеку javaFX, и мой .app не работает.Но если я запускаю тот же JAR с Jar Launcher.app , он работает отлично.Каким-то образом он выбирает правильную версию JRE.ExcelsiorJet, install4j и подобные приложения работают хорошо, но мой проект OpenSource, и я не могу заплатить 3000 $ за это.

Вопрос в том, как мне создать приложение для запуска MacOs / Windows / dmg / pkg / exe без JRE для пользователей, у которых уже установлена ​​JRE?Могу ли я использовать IntelliJ IDEA для создания этого способа, как я построил с помощью jre в комплекте?

1 Ответ

0 голосов
/ 11 ноября 2018

Хорошо, похоже, я нашел какой-то криво способ сделать все это.

Решение для Windows:

Для связывания в Windows легко использовать launch4j (только для Windows). Это бесплатно и нет проблем для создания .exe без Jre в комплекте.

Решение MacOS:

Для MacOS это немного сложнее:

  1. Создайте папку myApplication.app и спроектируйте ее структуру

    enter image description here

  2. Написать скрипт запуска bash: В моем случае я должен определить, какие версии Jre установлены, и выбрать любую из java 1.8 и 10

Я не знаю языка сценариев bash, и я считаю, что пишу его неоптимизированным способом. Я был бы счастлив, если бы кто-нибудь поправил меня. В любом случае, все работает так, как я хотел:

#!/bin/sh

# set the working directory
DIR=$(cd "$(dirname "$0")"; pwd) 

# extract first fit java version installed
jre_path=$(/usr/libexec/java_home -V 2>&1 |
while IFS= read -r line
do
    if [[ "$jre_found" ==  "true" ]]; then
        break
    fi
    version=$(echo $line | cut -d ' ' -f 1|sed 's/^ *//;s/ *$//' | cut -d ' ' -f 1 | sed 's/^ *//;s/ *$//')
    major=$(echo $version | cut -d. -f1)
    minor=$(echo $version | cut -d. -f2)
    array=(${line// /}) 
    array_size=${#array[@]}
    let "last_index=array_size-1"
    path=${array[ $last_index ]}

    if [[ $major == 1 ]]; then
        if [[ $minor -gt 7 && $minor -lt 11 ]]; then
            echo $path
            jre_found="true"
        fi
    elif [[ $major -gt 7 &&  $major -lt 11 ]]; then
        echo $path
        jre_found="true"
    fi
done)

# execute our jar file
$jre_path/bin/java -jar "$DIR"/myApp.jar

И теперь все должно работать с двойного щелчка на myApplication.app .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...