永久环境变量写入注册表、对所有新进程长期生效;临时环境变量仅存于当前cmd会话内存中、关闭即失效,且set命令设置的变量优先级高于永久变量。

永久环境变量和临时环境变量的核心区别在于生效范围和存在时间,不是看变量名,而是看它怎么设置、在哪设置、谁能看到。
看设置方式:命令行 set 是临时的
在 Windows 的命令提示符(cmd)里用 set 命令设置的,一律是临时环境变量:
- set JAVA_HOME=C:\Program Files\Java\jdk-17 → 当前窗口有效,关掉就没了
- set PATH=%JAVA_HOME%\bin;%PATH% → 只影响这次启动的 cmd 和它启动的子程序(比如 javac)
- 即使你写了 set PATH=... 覆盖了系统 PATH,其他已打开的窗口或桌面程序完全不受影响
看配置位置:图形界面改的是永久的
通过“系统属性 → 高级 → 环境变量”对话框设置的,属于永久环境变量:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 在系统变量里新建或编辑 JAVA_HOME 或修改 Path → 对所有用户、所有新启动的程序生效
- 在用户变量里设置 MAVEN_HOME → 仅当前用户每次登录后自动加载,新打开的终端、IDE、浏览器都继承它
- 这类设置写入注册表(Windows)或 shell 配置文件(Linux/macOS),重启或新开终端即生效
看优先级和覆盖关系
同一变量名可能同时存在多个层级,实际使用时按以下顺序生效(高优先级覆盖低优先级):
- 当前会话中用 set 设置的值(临时)
- 当前用户的环境变量(永久,用户级)
- 系统范围的环境变量(永久,系统级)
例如:系统变量里 JAVA_HOME 指向 jdk-11,你在 cmd 里执行 set JAVA_HOME=C:\jdk-17,那接下来在这个窗口里运行的 java 命令就用 jdk-17 —— 临时变量直接压过了永久变量。
看用途场景:什么时候该用哪种
- 需要反复切换 JDK 版本做兼容性测试 → 用 set JAVA_HOME + set PATH 临时切,不改系统配置
- 开发主力环境固定用某个 JDK → 在系统环境变量里配好 JAVA_HOME 和 Path,一劳永逸
- 只想让某个脚本临时用特殊路径 → 直接在批处理开头写 set PATH=...\bin;%PATH%,脚本结束自动还原
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










