打包适用于没有 JRE 的 Mac 和 Windows 的 Jar 文件
Posted
技术标签:
【中文标题】打包适用于没有 JRE 的 Mac 和 Windows 的 Jar 文件【英文标题】:Packaging Jar file for Mac and Windows without JRE bundled 【发布时间】:2019-04-14 00:32:59 【问题描述】:我在 IntelliJ IDEA 中将我的 javaFX 应用程序构建为 jar 文件。 使用“Project Structure >> Artifacts >> + JavaFX Application”我可以构建包含 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 和类似的应用程序运行良好,但我的项目是开源的,我不能为此支付 3000 美元。
问题是 - 如何为已安装 JRE 的用户构建不捆绑 JRE 的 MacOs/Windows 原生启动器 app/dmg/pkg/exe?我可以使用 IntelliJ IDEA 来构建这种方式,就像我使用捆绑了 jre 构建的那样吗?
【问题讨论】:
【参考方案1】:好的,看来我找到了一些不正当的方法来完成这一切。
Windows 解决方案:
要在 Windows 上捆绑,使用 launch4j 很容易(仅限 Windows)。它是免费的,创建没有 Jre 捆绑的 .exe 没有问题。
MacOS 解决方案:
对于 MacOS,这有点困难:
创建 myApplication.app 文件夹并设计其结构
编写启动器 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,一切都应该正常了。
【讨论】:
以上是关于打包适用于没有 JRE 的 Mac 和 Windows 的 Jar 文件的主要内容,如果未能解决你的问题,请参考以下文章
如何发布适用于 Windows 或 Mac 或 Linux 系统的 Electron 应用程序?
适用于 Mac 的 Air Native Extension - “没有命名的方法”
适用于 iOS 的 Visual Studio Ionic 应用程序打包
mac Big Sur系统 mvn打包报错:No compiler is provided in this environment. Perhaps you are running on a JRE