关于环境变量的一点心得

环境变量的作用

因为我接触到环境变量是在为Java配置环境变量时,因此仅谈谈对于环境变量 PATH 在命令行执行命令时的作用的理解。

简单讲,就是当你在cmd执行命令行命令时,系统除了在当前工作目录寻找命令(或可执行文件),还在环境变量中涉及到的目录去寻找。

举个简单的例子,例如我的steam下载在 D 盘根目录下,我想用命令行启动steam客户端,那么有两种方法。

1.在 D:\steam 目录下启动 cmd,并在命令行输入 steam。

2.若此时工作目录并不在该目录,在命令行输入 steam 会被提示“ 'steam' 不是内部或外部命令,也不是可运行的程序或批处理文件。”此时可以将 D:\steam 配置进环境变量 PATH 当中,就能便捷地在任意目录下使用 cmd 输入 steam 来打开 steam 客户端了(不会有人这样做的对吧)。

系统环境变量与用户环境变量

在配置环境变量当中可以看到这两个选项,关于二者的区别字面上很容易理解,就是公共与私有的关系,这里讲讲在配置 Java 的环境变量时遇到的有趣现象。

似乎所有人学习 Java 之初都会跟着教程配置一遍环境变量,不过看了另外一个博主的文章,他有讲到,配置环境变量目前来看似乎只是多此一举。

(下面是原文链接,感兴趣可以看看Java环境变量,真的还有必要配吗? - 腾讯云开发者社区-腾讯云 (tencent.com)

简单讲,一是因为至少据我所知,在 jdk8 之后,在安装过程中会自动为你配置环境变量;二是配置环境变量的目的似乎仅仅在于能够在任意目录下使用 java 与 javac 命令,但是尝试过发现,在 jdk\bin 目录下无论是否有环境变量,都是可以直接使用 java 与 javac 命令的,且在绝大部分人使用集成平台进行开发的情况下,是不会使用 javac 编译 Java 程序的。

遇到的有趣现象在于,我因为需要,同时安装了 jdk17 与 jdk8 两个版本,搜索学习了如何自由切换两个版本的方法,大概就是在环境变量中配置 JAVA_HOME8 与JAVA_HOME17 分别对应两个版本的安装路径,然后配置 JAVA_HOME,其值根据需要使用的版本填入 %JAVA_HOME8% 或 %JAVA_HOME17% ,实现版本切换。(注意在切换后需要重新启动 cmd 查看当前 Java 版本)

然后在此时遇到了问题:其实并没有切换成功。查资料后发现,对于环境变量 PATH,系统在根据环境变量查询时,其实是有先后顺序的。前面提到的自动配置环境变量,对于 jdk17 是在系统环境变量的 PATH 下,添加了如下两个目录,且顺序较我自己添加的 %JAVA_HOME%\bin 是靠前的,于是将自己配置的变量提前,发现依然无法从 jdk17 切换到 jdk8。

又经过查询发现,有人尝试删去上述两个目录,并成功实现切换。(如果怕删去造成影响可以在目录前后随意加一些字符,例如 .bak,相当于注释掉了该条目录)可是我明明让自己配置的变量在前面了,为什么会不起作用呢?

反复试验后发现,原因在我的 JAVA_HOME、JAVA_HOME8、JAVA_HOME17 等一系列变量,配置为了用户环境变量。推测系统对于环境变量的检索逻辑为先索引系统环境变量,后用户环境变量,即使将 JAVA_HOME 放在系统变量中,而将 JAVA_HOME8 与 JAVA_HOME17 放在用户变量中,同样不行。于是推测当系统调用到 %JAVA_HOME%\bin 时,因为 JAVA_HOME 中嵌套了用户变量,系统不会立即去寻找 JAVA_HOME的取值,而是访问了之后的所有系统变量后,再对嵌套的用户变量进行调用,因而即使 %JAVA_HOME%\bin 是靠前的,还是先访问了上图中的两个目录,并且调用了 jdk17 版本的Java。

文章为个人见解,如有谬误及不妥之处欢迎指正,感谢您的教导

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值