java - 未捆绑 JRE 的 Mac 和 Windows 打包 Jar 文件

标签 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 native 启动器 app/dmg/pkg/exe?我可以使用 IntelliJ IDEA 以捆绑 jre 构建的方式构建它吗?

最佳答案

好吧,看来我找到了一些歪曲的方法来完成这一切。

Windows solution:

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

MacOS solution:

对于 MacOS,它有点难:

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

    enter image description here

  2. 编写启动器 bash 脚本: 在我的例子中,我应该检测安装了哪些版本的 Jre 并选择 java 1.810
  3. 之间的任何一个

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 一切正常。

关于java - 未捆绑 JRE 的 Mac 和 Windows 打包 Jar 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53242661/

相关文章:

macos - Bash:遍历文本文件中列出的文件并 move 它们

linux - BASH: "export k=1"与 "k=1"之间的区别

java - 如何更改线图 JavaFX 的颜色

javafx - 使用 COMPUTED_SIZE 时 GridPane 会截断 Label

java - 从 JavaFX 中阶段的实例访问 UI 组件

java - 计算同一测试对象的总实例数。 RFT :Java

java - ClassLoader 是否应该能够从不同的包中解析和加载类?

java - KeyEvent 监听器中的多个键

java - 使用 Guice,如何注入(inject)父类(super class)的构造函数参数?

bash - 在不关闭 shell 的情况下返回退出代码