打包适用于没有 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.810 之间选择任何一个

我不知道 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 - “没有命名的方法”

电子制造商:EACCES:权限被拒绝

适用于 iOS 的 Visual Studio Ionic 应用程序打包

HSQLDB - 适用于外部 Jar - 不适用于 JRE

mac Big Sur系统 mvn打包报错:No compiler is provided in this environment. Perhaps you are running on a JRE