问题由来
在使用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上对于此问题的相关讨论:讨论链接