关闭终端实例后,JAVA_HOME 未设置/保存到路径变量

Nit*_*egi 2 java macos bash terminal environment-variables

直到最近我一直在使用 Java 1.7 作为我的代码库,最近我们升级到了 Java 8。当我尝试将 .bash_profile / .bashrc 文件中的 JAVA_HOME 变量设置为:

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_101.jdk/Contents/Home
export PATH=$JAVA_HOME/bin:$PATH
Run Code Online (Sandbox Code Playgroud)

并保存并使用源 .bash_profile,java -version 指向:

Nitin-Vegis-MacBook-Pro:/ nitinsuryavegi$ java -version
java version "1.8.0_101"
Java(TM) SE Runtime Environment (build 1.8.0_101-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.101-b13, mixed mode)
Run Code Online (Sandbox Code Playgroud)

但是当我退出终端/关闭会话并重新检查 java - 版本时,它指向旧版本,如下所示:

Nitin-Vegis-MacBook-Pro:/ nitinsuryavegi$ java -version
java version "1.7.0_79"
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)
Run Code Online (Sandbox Code Playgroud)

你能帮我永久设置 JAVA_HOME 路径,这样我每次登录终端时都不需要运行源 .bash_profile 以将 java -version 从 1.7 更改为 1.8。

也有人可以帮助我理解:

  1. .bash_profile 和 .bashrc 文件的区别。
  2. 当我在系统首选项中检查 Java 运行时版本时,它已指向 1.8

单击此处获取参考,但是当我检查终端中的 java -version 时,它显示为:

java version "1.7.0_79"
Run Code Online (Sandbox Code Playgroud)
  1. $JAVA_HOMEwhereis java命令有什么区别?

Ste*_*n C 5

关闭终端实例后,JAVA_HOME 未设置/保存到路径变量

那是正确的。在普通 shell 中,当 shell 退出时,您对 shell 中的环境变量所做的更改将丢失。(这适用于 Linux、UNIX、Mac OS 甚至 Windows“cmd.exe”。)

在 Linux、UNIX 和(我猜)Mac OS 上处理此问题的正常方法是将 shell 命令设置所需的变量到 shell 的“rc”文件之一中,或放入您用来运行您的 Java 应用程序(或其他应用程序)。


你能帮我永久设置 JAVA_HOME 路径,这样我每次登录终端时都不需要运行源 .bash_profile 以将 java -version 从 1.7 更改为 1.8。

在 UNIX/Linux 上,一种可能性是将全局设置放入/etc/profile. 但是,我不知道这是否适合 MacOS。在您的情况下,可能是您将设置放入了错误的文件中,或者您将错误的设置放入了正确的文件中。

但这就是“man bash”关于 shell 初始化的说法(在我的 Linux 系统上):

当 bash 作为交互式登录 shell 或作为具有--login选项的非交互式 shell 调用时,它首先从文件中读取并执行命令/etc/profile(如果该文件存在)。读取该文件后,它会按该顺序查找~/.bash_profile~/.bash_login、 和~/.profile,并从第一个存在且可读的命令中读取和执行命令。...

当一个不是登录 shell 的交互式 shell 启动时,bash 读取并执行来自 的命令~/.bashrc(如果该文件存在)。这可以通过使用--norc选项来禁止。该--rcfile文件选项将强制bash读取和文件,而不是执行命令~/.bashrc


也有人可以帮助我理解:1) .bash_profile 和 .bashrc 文件之间的区别。

看上面。


2) 当我在系统偏好设置中检查 Java 运行时版本时,它已指向 1.8,但是当我运行时

$ java -version
Run Code Online (Sandbox Code Playgroud)

我得到这个输出:

java version "1.7.0_79"
Run Code Online (Sandbox Code Playgroud)

我的猜测是你的 shell 初始化文件是什么覆盖了你在系统偏好设置中设置的内容。另外,我怀疑您可能误解了 shell 如何查找命令。正如“man bash”所解释的,shell实际上会使用$PATH变量搜索命令。这是您应该检查的变量,以找出原因java -version以及whereis java行为不符合您的预期。

您可以通过键入来检查 shell 中的实际环境变量设置

$ export
Run Code Online (Sandbox Code Playgroud)

3)$JAVA_HOMEwhereis java命令有什么区别?

第一个是环境变量......它不是命令搜索路径。第三方工具通常使用它来定位 JDK / JRE。但是 JDK / JRE 工具本身忽略了它!

第二个是内置命令,它试图在 shell 的实际命令搜索路径上查找命令。