Mac os 中安装Java jdk,并解决JAVA_HOME不生效的问题。

mac中下了个jd gui,一直启动不成功。提示的信息是:“No suitable Java version found on your system!
This program requires Java 1.8+
Make sure you install the required Java version.”

在命令行中输入: java -version 输出:

java version "1.8.0_211"
Java(TM) SE Runtime Environment (build 1.8.0_211-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode)

不确认1.8+ 包含不包含1.8,于是需要升级一下jdk版本了。

我没有选择安装包的方式,直接选择了“macos-x64_bin.tar.gz (sha256)” 方式。下载地址见下:

https://www.oracle.com/java/technologies/downloads/#jdk20-mac

具体的安装方式如下:

#在下载路径中,解压文件
tar -zxf jdk-20_macos-x64_bin.tar.gz 
#将解压文件移动到目标目录中。目标路径默认就存在的,无需其他的操作。
sudo mv jdk-20.0.2.jdk /Library/Java/JavaVirtualMachines/

# 我使用下面的命令,将之前的版本删除了。
# rm -rf /Library/Java/JavaVirtualMachines/jdk1.8.0_211.jdk
# 查看版本信息
java -verision

升级完jdk版本后,再次重新启动jd gui ,仍就报上面的错误。此时我猜测是由于JAVA_HOME,jd gui 无法获取到导致的。那么需要排查下 JAVA_HOME

echo $JAVA_HOME

的时候,结果输出为空.

原因分析:是由于没有将JAVA_HOME配置到环境变量中,于是使用命令

cat ~/.bash_profile

发现JAVA_HOME存在.bash_profile中。为什么没有生效那。执行

source ~/.base_profile

后, 在当前窗口是生效的。可我重新启动了一个terminal 执行 echo $JAVA_HOME 仍输出空行。很显然.bash_profile并没有命令行启动的时候,进行加载。于是我尝试将JAVA_HOME添加到 /etc/profile中。结果仍是不生效。

export JAVA_HOME=$(/usr/libexec/java_home)

此时我开始困惑了,/etc/profile 也没有加载。于是乎,我隐隐约约的执行了

echo $SHELL

结果输出的是

/bin/zsh

也就意味着,mac 的shell是zsh,不是bash. 于是我将

export JAVA_HOME=$(/usr/libexec/java_home)

添加到了 /etc/zprofile中, 再次重启一个新终端,echo $JAVA_HOME 果然成功了。此时欣喜若狂,点击了下jd gui 的图标。结果仍报开始的错误。此时我就有点懵了。

于是开启我的分析步骤:

进入 /Applications/JD-GUI.app/Contents/MacOS/ 路径下,查看”universalJavaApplicationStub.sh” 脚本。其中保存的内容:

# first check system variable "$JAVA_HOME"
if [ -n "$JAVA_HOME" ] ; then
    JAVACMD="$JAVA_HOME/bin/java"

# check for specified JVMversion in "/usr/libexec/java_home" symlinks
elif [ ! -z ${JVMVersion} ] && [ -x /usr/libexec/java_home ] && /usr/libexec/java_home -F; then

    if /usr/libexec/java_home -F -v ${JVMVersion}; then
        JAVACMD="`/usr/libexec/java_home -F -v ${JVMVersion} 2> /dev/null`/bin/java"
    else
        # display error message with applescript
        osascript -e "tell application \"System Events\" to display dialog \"ERROR launching '${CFBundleName}'\n\nNo suitable Java version found on your system!\nThis program requires Java ${JVMVersion}\nMake sure you install the required Java version.\" with title \"${CFBundleName}\" buttons {\" OK \"} default button 1 with icon path to resource \"${CFBundleIconFile}\" in bundle (path to me)"
        # exit with error
        exit 3
    fi

# otherwise check "/usr/libexec/java_home" symlinks
elif [ -x /usr/libexec/java_home ] && /usr/libexec/java_home -F; then
    JAVACMD="`/usr/libexec/java_home 2> /dev/null`/bin/java"

# otherwise check Java standard symlink (old Apple Java)
elif [ -h /Library/Java/Home ]; then
    JAVACMD="/Library/Java/Home/bin/java"

# fallback: public JRE plugin (Oracle Java)
else
    JAVACMD="/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/bin/java"
fi

上面的shell脚本中,清楚的看到开始校验 $JAVA_HOME就失效了。于是我看到jd-gui-1.6.6-min.jar了。

Contents
    MacOS
        universalJavaApplicationStub.sh
Resources
    Java
        jd-gui-1.6.6-min.jar
        jd-gui.cfg
    jd-gui.icns
Info.plist

于是我进入了 jd-gui-1.6.6-min.jar 执行

java -jar jd-gui-1.6.6-min.jar

成功启动.jd gui 启动解决。也就不与他的启动脚本较劲了。有兴趣的朋友,可自行解决。

end
  • 作者:kali(作者介绍)
  • 更新时间:2022-07-20 18:09
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 转载声明:转载站点文章,请附上原文链接
  • 翻译声明:翻译文章会不严谨,请务必附上原文链接
  • 扫描阅读:扫描二维码,手机阅读该文章