You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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默认返回你想要的版本:

  1. 打开「系统偏好设置」→找到「Java」图标(如果没看到,确保已安装JDK的控制面板);
  2. 切换到「Java」标签页→点击「查看」按钮;
  3. 在弹出的「Java运行时环境设置」窗口里,找到1.8.0_151,把它拖到列表的最顶部;
  4. 重启终端或者重新打开shell,再运行/usr/libexec/java_home就会返回1.8.0_151的路径了。

方案3:给java_home设置别名(永久生效)

如果不想改系统设置,可以在shell的配置文件里加个别名,让java_home命令默认带版本参数:

  1. 打开你的shell配置文件:bash用户编辑~/.bash_profile,zsh用户编辑~/.zshrc
  2. 在文件末尾添加一行:
    alias java_home='/usr/libexec/java_home -v 1.8.0_151'
    
  3. 保存后执行source ~/.bash_profile(或source ~/.zshrc)使配置生效,之后输入java_home就会直接返回1.8.0_151的路径了。

方案4:修改JDK的版本优先级(不推荐)

这个方法需要修改JDK目录里的配置文件,有一定风险,谨慎操作:

  1. 打开1.8.0_151的Info.plist文件:
    open /Library/Java/JavaVirtualMachines/jdk1.8.0_151.jdk/Contents/Info.plist
    
  2. 找到CFBundleVersionJavaVersion这两个字段,把它们的值改成比171高的,比如1.8.0_172
  3. 保存文件后,重新运行/usr/libexec/java_home -V,你会发现151排在前面了,默认返回它的路径。

内容的提问来源于stack exchange,提问作者old_bear

火山引擎 最新活动