Iga*_*Iga 5 java bash javafx 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 和类似的应用程序运行良好,但我的项目是开源的,我无法为此支付 3000 美元。
问题是 - 如何在没有为已经安装 JRE 的用户捆绑 JRE 的情况下构建 MacOs/Windows 本机启动器 app/dmg/pkg/exe?我可以使用 IntelliJ IDEA 以我捆绑 jre 的方式构建这种方式吗?
好吧,看起来我找到了一些奇怪的方法来完成这一切。
Windows解决方案:
要在 Windows 上捆绑,可以轻松使用launch4j(仅限 Windows)。它是免费的,并且在不捆绑 Jre 的情况下创建.exe没有问题。
Mac 解决方案:
对于 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
Run Code Online (Sandbox Code Playgroud)
现在双击myApplication.app一切都应该正常工作。