不捆绑JRE的Mac和Windows打包Jar文件

时间:2018-11-10 19:30:33

标签: java bash javafx jar

我在IntelliJ IDEA的javaFX应用程序中内置了 jar 文件。 使用“ 项目结构>>工件>> + JavaFX应用程序”,我可以构建包含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和类似的应用程序运行良好,但是我的项目是OpenSource,我不能为此支付3000美元。

问题是-我如何在不为已安装JRE的用户捆绑JRE的情况下构建MacOs / Windows本机启动器app / dmg / pkg / exe?我可以使用IntelliJ IDEA来构建捆绑了jre的这种方式吗?

1 个答案:

答案 0 :(得分:1)

好吧,看来我找到了某种歪曲的方式来完成这一切。

  

Windows解决方案:

要在Windows上捆绑,很容易使用 launch4j (仅Windows)。它是免费的,并且没有捆绑Jre即可创建 .exe

  

MacOS解决方案:

对于MacOS来说,要难一些:

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

    enter image description here

  2. 编写启动器bash脚本: 就我而言,我应该检测安装了哪个版本的Jre,并在 java 1.8 10
  3. 之间进行选择。
  

我不知道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 ,一切都应该可以正常工作。