最惨莫过于在 Windows 上部署生产环境了吧 :( 。
如果有条件,宁愿直接上虚拟机。
Windows 的环境变量和平常认知的并不一样,同样是分成用户变量和系统变量,用户变量只在当前用户环境下生效,系统变量全局生效。
但是,在拼接 PATH 时,Windows 会把用户变量 append 到系统变量后面,并且 Windows 的处理方式是:会按照顺序使用发现的程序。
比如系统中已经安装了 Java 1.7
C:\Program Files\Java\jdk1.7.0_09
这时候新建了一个用户 user ,希望在此用户执行命令时使用 Java11,因此安装
C:\Program Files\Java\jdk-11.0.2
接着配置环境变量
用户:
JAVA_HOME=C:\Program Files\Java\jdk-11.0.2
系统:此时在 System 中存在一个 JAVA_HOME=C:\Program Files\Java\jdk1.7.0_09
PATH=…;%JAVA_HOME%\bin;
本来以为 User 变量会覆盖 System 变量,在 cmd 中却发现,java -version: 1.7,继续查看其他变量值:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| C:\Users\Administrator>java -version java version "1.7.0_09" Java(TM) SE Runtime Environment (build 1.7.0_09-b05) Java HotSpot(TM) 64-Bit Server VM (build 23.5-b02, mixed mode)
C:\Users\Administrator>where java C:\Windows\System32\java.exe C:\Program Files\Java\jdk1.7.0_09\bin\java.exe
C:\Users\Administrator>echo %PATH% C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\software\mysql-5.721-winx64\bin;C:\Program Files\Java\jdk1.7.0_09\bin;
C:\Users\Administrator>echo %JAVA_HOME% C:\Program Files\Java\jdk-11.0.2
|
可以看到 where java 中没有 Java11 的信息,于是尝试在用户变量中添加 PATH=%JAVA_HOME%\bin;,此时:
1 2 3 4 5 6 7
| C:\Users\Administrator>echo %PATH% C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\software\mysql-5.7.21-winx64\bin;C:\Program Files\Java\jdk1.7.0_09\bin;C:\Program Files\Java\jdk-11.0.2\bin;
C:\Users\Administrator>where java C:\Windows\System32\java.exe C:\Program Files\Java\jdk1.7.0_09\bin\java.exe C:\Program Files\Java\jdk-11.0.2\bin\java.exe
|
现在已经有 Java11 的信息了,但是并不会被优先调用,如果一定要调用,必须将 JAVA_HOME 放在系统变量最前面。
如果我没有系统管理员权限呢???