终端实例关闭后,JAVA_HOME不会被设置/保存到路径变量中

时间:2016-12-16 11:10:39

标签: java bash macos 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

并保存并使用源.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)

但是当我退出终端/关闭会话并重新检查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)

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

也有人可以帮助我理解:

  1. .bash_profile和.bashrc文件之间的区别。
  2. 当我在系统偏好设置中检查Java Runtime版本时,它已被指向1.8
  3. Click here for reference,但是当我检查终端中的java -version时,它显示为:

    java version "1.7.0_79"
    
    1. $ JAVA_HOME whereis java 命令有什么区别?

2 个答案:

答案 0 :(得分:2)

  

关闭终端实例后,未将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
     

我得到了这个输出:

java version "1.7.0_79"

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

您可以通过键入

来检查shell中的实际环境变量设置
$ export
  

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

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

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

答案 1 :(得分:1)

  

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

这是不正确的。保存后,它将保存到PATH变量中。但是它不会影响当前打开的终端窗口,只会影响新窗口。关闭终端窗口与它无关。