找不到正确的java_home路径报错解决:@@HOMEBREW_JAVA@@

1,470 阅读2分钟

问题由来

在使用homebrew安装jadx后无法正常启动,报错如下:

example % jadx Original\$\$EnhancerByCGLIB\$\$818cf910.class

ERROR: JAVA_HOME is set to an invalid directory: @@HOMEBREW_JAVA@@
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation.

看报错的字面意思表示找不到jdk的路径,但是查看java版本以及路径配置:

~ % java -version

openjdk version "17.0.1" 2021-10-19

OpenJDK Runtime Environment (build 17.0.1+12-39)

OpenJDK 64-Bit Server VM (build 17.0.1+12-39, mixed mode, sharing)

~ % vim ~/.bash_profile

...
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-17.0.1.jdk/Contents/Home
...

发现并没有什么问题,那么是什么导致jadx找不到正确的路径呢?

问题排查

首先查看jadx的安装位置,由于是通过homebrew安装,通过如下命令可以查看jadx的安装路径:

~ % brew list jadx                         

/opt/homebrew/Cellar/jadx/1.4.7/bin/jadx
/opt/homebrew/Cellar/jadx/1.4.7/bin/jadx-gui
/opt/homebrew/Cellar/jadx/1.4.7/libexec/bin/ (4 files)
/opt/homebrew/Cellar/jadx/1.4.7/libexec/lib/ (51 files)

进入bin目录后vim查看一下jadx文件:

~ % vim jadx

#!/bin/bash

JAVA_HOME="${JAVA_HOME:-@@HOMEBREW_JAVA@@}" exec "/opt/homebrew/Cellar/jadx/1.4.7/libexec/bin/jadx"  "$@"

可以看到启动命令中的JAVA_HOME变成了-@@HOMEBREW_JAVA@@,正好对应上了上面的报错。

解决方案

第一种:暴力解决法

最快的方式就是直接修改启动命令,由于是只读文件,先修改权限:

bin % sudo chmod 777 jadx

然后拿到上文中找到的正确的java_home的值替换-@@HOMEBREW_JAVA@@,替换后的启动命令如下:

#!/bin/bash

JAVA_HOME="${JAVA_HOME:-/opt/homebrew/opt/openjdk/libexec/openjdk.jdk/Contents/Home}" exec "/opt/homebrew/Cellar/jadx/1.4.7/libexec/bin/jadx"  "$@"

替换后即可正常使用jadx。

第二种:正常解决法

想要正常的解决得先知道这个错误发生的原理,我们国内的用户使用homebrew时一般都是配置了国内的镜像源来提速的,而问题就出在国内的镜像源上了,从国内镜像安装依赖于 Java 的某些配置目前无法正常工作,正常来说@@HOMEBREW_JAVA@@是会被替换掉的,但是因为使用了国内的镜像源导致没有正常的被替换。而brew需要清单才能正确替换@@HOMEBREW_JAVA@@,但brew只知道如何从ghcr.io 获取清单。

查看 HOMEBREW_BOTTLE_DOMAIN 如下:

bin % echo $HOMEBREW_BOTTLE_DOMAIN               

https://mirrors.ustc.edu.cn/homebrew-bottles/bottles

想要正确安装只需要使用如下命令即可:

~ % HOMEBREW_BOTTLE_DOMAIN= brew reinstall kafka

最后附上github上对于此问题的相关讨论:讨论链接