我在IntelliJ IDEA的javaFX应用程序中内置了 jar 文件。 使用“ 项目结构>>工件>> + JavaFX应用程序”,我可以构建包含JRE的.app,.dmg,.pkg,.exe。 但是我需要构建没有捆绑JRE的相同文件。 当然,我可以使用JAR,但我想创建自己的图标,甚至可以安装程序。
我还尝试从 jar 创建.app文件夹以手动执行“ java -jar myJarName.jar ”,但是如果我有多个JDK版本-它总是使用不包含javaFX库的最新版本(JRE 11),我的.app无法正常工作。但是,如果我使用 Jar Launcher.app 运行相同的JAR,则效果很好。它以某种方式选择了正确的jre版本。 ExcelsiorJet,install4j和类似的应用程序运行良好,但是我的项目是OpenSource,我不能为此支付3000美元。
问题是-我如何在不为已安装JRE的用户捆绑JRE的情况下构建MacOs / Windows本机启动器app / dmg / pkg / exe?我可以使用IntelliJ IDEA来构建捆绑了jre的这种方式吗?
答案 0 :(得分:1)
好吧,看来我找到了某种歪曲的方式来完成这一切。
Windows解决方案:
要在Windows上捆绑,很容易使用 launch4j (仅Windows)。它是免费的,并且没有捆绑Jre即可创建 .exe 。
MacOS解决方案:
对于MacOS来说,要难一些:
我不知道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 ,一切都应该可以正常工作。