Mac 10.12下如何修改/usr/libexec/java_home默认返回路径——设置JAVA_HOME后java -version正常但java_home仍指向旧Java版本
Mac下java -version与/usr/libexec/java_home返回版本不一致的问题
我在Mac 10.12系统里装了两个Java 8版本:1.8.0_171和1.8.0_151,已经把JAVA_HOME设为1.8.0_151的路径,执行java -version显示的是1.8.0_151,符合预期,但运行/usr/libexec/java_home却一直返回1.8.0_171的路径,这是怎么回事?怎么修改它的默认返回路径?
相关操作及输出
# 列出所有Java版本 /usr/libexec/java_home -V Matching Java Virtual Machines (2): 1.8.0_171, x86_64: "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home 1.8.0_151, x86_64: "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_151.jdk/Contents/Home /Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home # 设置JAVA_HOME指向1.8.0_151 export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_151.jdk/Contents/Home # java -version显示正常 java -version java version "1.8.0_151" Java(TM) SE Runtime Environment (build 1.8.0_151-b12) Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode) # 但java_home仍返回旧版本 /usr/libexec/java_home /Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home
原因分析
其实/usr/libexec/java_home这个工具的工作逻辑和JAVA_HOME环境变量没有直接关联。它是通过扫描系统里的JDK安装目录,然后按照以下优先级返回路径:
- 优先选择同大版本下更新的小版本(比如1.8.0_171比1.8.0_151新,所以默认会选它);
- 如果版本号相同,会参考系统偏好设置里Java控制面板的排序;
- 最后才会考虑JDK安装目录的命名顺序,但这个影响很小。
你设置的JAVA_HOME只是让java命令调用指定版本,但java_home工具本身并不读取这个变量,所以才会出现两者返回版本不一致的情况。
解决方法
这里给你几个可行的方案,根据自己的需求选:
方案1:临时指定版本调用
如果只是偶尔需要获取1.8.0_151的路径,可以直接在命令后加版本参数:
/usr/libexec/java_home -v 1.8.0_151
方案2:修改系统Java偏好设置(永久生效)
这个方法能让java_home默认返回你想要的版本:
- 打开「系统偏好设置」→找到「Java」图标(如果没看到,确保已安装JDK的控制面板);
- 切换到「Java」标签页→点击「查看」按钮;
- 在弹出的「Java运行时环境设置」窗口里,找到1.8.0_151,把它拖到列表的最顶部;
- 重启终端或者重新打开shell,再运行
/usr/libexec/java_home就会返回1.8.0_151的路径了。
方案3:给java_home设置别名(永久生效)
如果不想改系统设置,可以在shell的配置文件里加个别名,让java_home命令默认带版本参数:
- 打开你的shell配置文件:bash用户编辑
~/.bash_profile,zsh用户编辑~/.zshrc; - 在文件末尾添加一行:
alias java_home='/usr/libexec/java_home -v 1.8.0_151' - 保存后执行
source ~/.bash_profile(或source ~/.zshrc)使配置生效,之后输入java_home就会直接返回1.8.0_151的路径了。
方案4:修改JDK的版本优先级(不推荐)
这个方法需要修改JDK目录里的配置文件,有一定风险,谨慎操作:
- 打开1.8.0_151的Info.plist文件:
open /Library/Java/JavaVirtualMachines/jdk1.8.0_151.jdk/Contents/Info.plist - 找到
CFBundleVersion和JavaVersion这两个字段,把它们的值改成比171高的,比如1.8.0_172; - 保存文件后,重新运行
/usr/libexec/java_home -V,你会发现151排在前面了,默认返回它的路径。
内容的提问来源于stack exchange,提问作者old_bear




