当前位置: 代码迷 >> 综合 >> 配置环境变量(以 JDK 1.8为例)macOS Mojave
  详细解决方案

配置环境变量(以 JDK 1.8为例)macOS Mojave

热度:112   发布时间:2023-11-13 17:18:55.0

什么是环境变量

环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。
环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所将使用到的信息。例如Windows和DOS操作系统中的path环境变量,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到path中指定的路径去找。用户通过设置环境变量,来更好的运行进程。

环境变量有什么作用

1.设置参数

环境变量相当于给系统或用户应用程序设置的一些参数,具体起什么作用这当然和具体的环境变量相关。比如 PATH,是告诉系统,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到哪些目录下去寻找;再如 tc 或 vc++ 中,set include = path1; path2; 是告诉编译程序到哪里去找 .h 类型的文件;当然不仅仅是指定什么路径,还有其它的作用的,如 set dircmd=/4 设置一个环境变量的作用是在使用 di r命令时会把 /4 作为缺省的参数添加到你的 dir 命令之后,就像你的每个命令都加了 /4 参数,它实际上是给命令解释程序 command 设置的一个环境变量,并且是给 dir 这个内部命令设置的。
分析本地故障时原因很可能就是因为环境变量中的默认路径被删除的结果,默认路径一经设置,当前系统如有程序运行时需要某些 DLL 或 EXE 文件,以及 Active 控件时就会到所有默认路径中去查找,如果在这些目录中查找到相应的程序则自动加载,查找不到则报告缺少某某文件的错误信息。

2.软件共用

很多朋友会在自己的计算机上安装双系统,例如 C 盘安装 Windows XP,D 盘安装 Windows 7。可是某些软件往往只在 Windows XP 系统中安装,Windows 7 系统中是无法正常使用的,比较麻烦却有效的方法是再安装一遍。当我们了解了环境变量中的用途后就可以很好解决双系统的软件共用问题。

3.系统运行

为什么在 Windows XP 中安装了的软件在 Windows 7 下无法运行呢(绿色软件除外)?原因是安装软件时往往须要向系统目录中复制某些文件,而使用另外一个系统时会由于缺少这些文件而无法运行。因此,我们可以通过设置环境变量的方法来解决这个问题。

0.自己的理解

当我们需要编译 Java 文件的时候

  1. cd 到 Java 的目录下
  2. 执行 Java 命令
    看上去条理清晰,逻辑缜密,但是当我们需要同时使用多个工具的时候,比如又有 Java、Maven、Git 等等,而且是多台机器的时候,我们通常需要很多繁琐的 cd 操作。而配置环境变量就可以使我们可以快速的运行这些脚本了。

当我们需要快速切换 JDK 的版本

如果我们又有JDK1.7,又有JDK1.8,而且需要经常的切换,那么怎么办?
可以配置局部变量:

export JDK1.7=/usr/apps/jdk1.7
export JDK1.8=/usr/apps/jdk1.8
export PATH=$JDK1.7/bin

这样,在改变的时候,就不需要去不到改变,而改变部分句可以了。

环境变量的作用

它的作用就是,可以在任何目录下,都能快速地通过自定义的环境变量来访问到你指定的工具目录里的内容吗,这和 OS 里的快捷方式的思想比较类似,或者说是指针。

Mac 系统的环境变量

先来看一下自己 Mac 里的环境变量有什么吧

打开终端,输入 echo $PATH 出现下面的界面:
在这里插入图片描述
即:

Gandr$ echo $PATH
/Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:.

能看到,笔者的 Mac 中 PATH 环境变量有:
/Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home/bin
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin

环境变量文件的优先级

/etc/profile
/etc/paths
~/.bash_profile
~/.bash_login
~/.profile
~/.bashrc

注:Linux 里面是 .bashrc 而 Mac 是 .bash_profile

/etc/profile 和 /etc/paths 是系统级别的,系统启动就会加载,后面几个是当前用户级的环境变量。
后面 3 个按照从前往后的顺序读取,如果 /.bash_profile 文件存在,则后面的几个文件就会被忽略不读了,如果 /.bash_profile 文件不存在,才会以此类推读取后面的文件。~/.bashrc没有上述规则,它是bash shell打开的时候载入的。

PATH的语法为如下
#中间用冒号隔开
export PATH=$PATH:<PATH 1>:<PATH 2>:<PATH 3>:------:

上述文件的科普:
/etc/paths (全局建议修改这个文件 )
编辑 paths,将环境变量添加到 paths文件中 ,一行一个路径
Hint:输入环境变量时,不用一个一个地输入,只要拖动文件夹到 Terminal 里就可以了。
/etc/profile (建议不修改这个文件 )
全局(公有)配置,不管是哪个用户,登录时都会读取该文件。
/etc/bashrc (一般在这个文件中添加系统级环境变量)
全局(公有)配置,bash shell执行时,不管是何种方式,都会读取此文件
.profile 文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.并从/etc/profile.d目录的配置文件中搜集shell的设置
使用注意:如果你有对/etc/profile有修改的话必须得重启你的修改才会生效,此修改对每个用户都生效。
./bashrc 每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取.
使用注意 对所有的使用bash的用户修改某个配置并在以后打开的bash都生效的话可以修改这个文件,修改这个文件不用重启,重新打开一个bash即可生效。
./bash_profile 该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该文件被读取.(每个用户都有一个.bashrc文件,在用户目录下)

.bash_profile文件存在于用户主目录下,绝对路径为 /home/$name/.bash_profile
.bash_profile 文件是隐藏文件,里面包含的是用户的用户的环境变量。

在/home下的用户文件夹下,查看一下隐藏文件

这个文件不一定存在,如果存在,就在 ~/ ,即
~/.bash_profile但也很可能不存在,这时创建一个空文件,加入自己想要的内容就行。Linux中的配置文件很多都是这样,是要在需要时建立的,而程序在没有这些配置文件时,也可能正常运行。

使用注意 需要需要重启才会生效,/etc/profile对所有用户生效,~/.bash_profile只对当前用户生效。

source ./.bash_profile 或者 ./.profile 环境信息生效

以 JDK 为例,添加环境变量

1.输入touch .bash_profile,创建一个 .bash_profile 的隐藏配置文件(如果你之前没有创建过)

2.输入open -e .bash_profile,打开配置文件

3.输入以下配置:

JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_162.jdk/Contents/Home
PATH=$JAVA_HOME/bin:$PATH:
CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:.
export JAVA_HOME
export PATH
export CLASSPATH

注意:第一行的路径 jdk1.8.0_162.jdk/Contents/Home,JDK 版本不同,路径名也不同,注意修改。(为你自定义的安装路径)
然后保存关闭该窗口。

在这里插入图片描述

4.输入source .bash_profile,使配置生效

5.输入java -version,如果能看到 JDK 版本为你所下载的版本,说明配置成功

在这里插入图片描述

备注:如果只在终端使用 export
这个命令写入环境变量,它配置的只是临时变量,不能长期保存,电脑开关机后或重新打开终端或另开一个窗口,仍然会回到没有配置环境变量的状态。(真实性有待考证)

这里还有一种另外的配置文件的书写方法:

需要配置特别的环境名称位置,需要 export 名称 = 具体位置
下面是具体例子:

PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/git/bin::/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/git/bin:yourpathaddress/Library/Android/sdk/platform-tools:yourpathaddress/Library/Android/sdk/toolsexport JAVA_HOME=yourpathaddress/System/Library/Frameworks/JavaVM.framework/HomeANDROID_HOME=yourpathaddress/Library/Android/sdk/ 

这里JAVA_HOME、ANDROID_HOME输入的路径都是你本地安装的具体地址

配置环境变量 PATH 的方法

1.终端直接用 export 语句

export PATH=${PATH}:~/Library/Android/sdk/platform-tools:~/Library/Android/sdk/tools

以上操作确实达到了修改环境变量的目的, 但是仅仅保证对此次会话有效,也就是说当你重启终端后,你配置的这个 adb 的环境变量就失效了, 又得需要重新输入一次。
我们可以用 shell 的配置文件来将这条 shell 命令"持久化", 每次启动终端都自动运行。
配置文件里可以预置一些 shell 命令, 每次打开终端时自动加载配置文件,,从而实现预置代码的自动运行。

2.编写 shell 的预置配置文件

2.1 寻找当前 shell 的配置文件

echo $SHELL 来查看当前 shell 的版本,使用的 shell 不同,对应的配置文件也不同。

如果是 bash

vim ~/.bash_profile 或者 vim ~/.bashrc

如果是 zsh

vim ~/.zshrc

通过如下命令可切换shell
//切换到zsh
chsh -s `which zsh` 
//切换到bash
chsh -s `which bash`

重启终端 (如果是 Linux 可能需要重启系统才能生效)。
其他 shell 可通过 cat /etc/shells 查看当前系统已安装的 shell 所有版本。

2.2 修改配置文件

export PATH=${PATH}:~/Library/Android/sdk/platform-tools:~/Library/Android/sdk/tools

2.3 重载配置文件, 使修改生效

最直接的方式:重启终端
最优雅的方式:重载配置文件

source ~/.bash_profile 或者 . ~/.bash_profile

2.4 export 语法详解

· ${}为占位符,${PATH} 和 $PATH 等效
· =前后不能有空格
· : 为分隔符(等同于 Windows 环境变量中的 ;)
· PATH=$PATH:xxx 可以理解为 "PATH+=xxx"(当然不能这么写)
· PATH=xxx:$PATH 这种写法亦可,只是前后顺序的问题;

以上命令可以拆为两行:

(1)把 adb 所在路径 ~/Library/Android/sdk/platform-tools:~/Library/Android/sdk/tools 加入到 PATH 中去:

PATH=${PATH}:~/Library/Android/sdk/platform-tools:~/Library/Android/sdk/tools

(2)使环境变量生效:

export PATH

shell 中可以通过 export -p 命令查看所有环境变量。

3.修改 /etc/profile 文件

如果你的计算机仅仅作为开发使用时推荐使用这种方法,因为所有用户的 shell 都有权使用这些环境变量,可能会给系统带来安全性问题。
· 用文本编辑器打开 /etc/profile
· 在profile文件末尾加入:

export JAVA_HOME=/usr/share/jdk1.6.0_14
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

·重新登录

注:
a. 你要将 /usr/share/jdk1.6.0_14 改为你的 JDK 安装目录
b. Linux 下用冒号":“来分隔路径
c. PATH/PATH/CLASSPATH/$JAVA_HOME 是用来引用原来的环境变量的值在设置环境变量时特别要注意不能把原来的值给覆盖掉了,这是一种常见的错误
d. CLASSPATH 中当前目录”."不能丢,把当前目录丢掉也是常见的错误.
e. export 是把这三个变量导出为全局变量
f. 大小写必须严格区分

  相关解决方案