在 Mac 和 Windows 上打包 Jar 文件,不包含 JRE。

5
我在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的用户构建MacOs/Windows本机启动器应用程序/dmg/pkg/exe?我是否可以使用IntelliJ IDEA以与捆绑jre构建的方式来构建此应用程序?
1个回答

2

好的,看起来我找到了一些不太正当的方法来完成这一切。

Windows解决方案:

在Windows上打包很容易使用launch4j(仅限Windows)。它是免费的,没有问题可以创建不带Jre的.exe

MacOS解决方案:

对于MacOS来说有点难:

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

    enter image description here

  2. 编写启动器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应该可以正常运行了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接