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

问题由来

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

全部评论

相关推荐

在投简历的柠檬精很想...:可以明确说,问的东西几乎是简历上的东西。你写的确实有点模糊。面试可能会问你一些常用的通信的问题,差分信号走线之类的,单片机最小系统啥的,模电,数电,基本电源,buck,boost,ldo之类的吧。
点赞 评论 收藏
分享
08-16 00:44
已编辑
华南理工大学 Java
LazyBreeze:项目尽量体现你对技术的理解和深度,不是说把中间件用一下就完事了,你项目里面提到集群和分布式,你真在服务器上部署过吗,感觉太假了,第二个项目说自己用了微服务的什么组件,只是用了没有自己的思考,很难让面试官注意到你的简历。针对某几个技术点自己多思考一下,考虑一下有没有别的替代方案,可以写一下,即使没有真的实现
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务