java – 包装没有捆绑JRE的Mac和Windows的Jar文件

我在IntelliJ IDEA中构建了我的
javaFX应用程序作为jar文件.

使用“项目结构>>工件>>
JavaFX应用程序”我可以使用JRE构建.app,.dmg,.pkg,.exe.

但我需要在没有捆绑JRE的情况下构建相同的文件.

当然,我可以使用JAR,但我想制作自己的图标,也许是安装程序.

我也尝试从jar创建.app文件夹来手动执行它“java -jar myJarName.jar”,但如果我有几个JDK版本 – 它总是使用最新的(JRE 11),它不包括javaFX库和我的.app不不行.但是,如果我使用Jar Launcher.app运行相同的JAR,它就能完美运行.不知何故,它选择了正确的jre版本.
ExcelsiorJet,install4j和类似的应用程序运行良好,但我的项目是OpenSource,我不能支付3000美元.

问题是 – 如何为没有安装JRE的用户捆绑JRE而构建MacOs / Windows本机启动器app / dmg / pkg / exe?我可以使用IntelliJ IDEA构建这种方式,因为我使用jre捆绑构建了吗?

最佳答案 好吧,看起来我找到了一些弯曲的方式来做到这一切.

Windows solution:

要在Windows上捆绑,很容易使用launch4j(仅限Windows).它是免费的,创建没有Jre捆绑的.exe是没有问题的.

MacOS solution:

对于MacOS来说,这有点困难:

>创建myApplication.app文件夹并设计其结构

《java – 包装没有捆绑JRE的Mac和Windows的Jar文件》
>编写启动程序bash脚本:
在我的情况下,我应该检测安装了哪个版本的Jre,并在java 1.8和10之间选择

I don’t know bash script language and I believe I write it unoptimized way. I would be happy if anyone correct me. Anyway it works the way as I wanted:

#!/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来工作.

点赞