1. 什么是环境变量?
环境变量是在操作系统(如Windows、macOS和Linux)下运行的所有进程/用户都可以访问的全局系统变量。环境变量对于存储系统范围的值很有用,例如:
- PATH:最常用的环境变量,它存储一个目录列表,用于搜索可执行程序。
- 操作系统:操作系统。
- COMPUTENAME,USERNAME:存储计算机和当前用户名。
- SystemRoot:系统根目录。
- (Windows)HOMEDRIVE,HOMEPATH:当前用户的主目录。
2. Windows环境变量
Windows中的环境变量不区分大小写(因为旧版DOS不区分大小写)。它们通常用大写字母命名,并用下划线(_)连接单词,例如JAVA_HOME。
2.1 显示环境变量及其值
要列出所有环境变量及其值,请启动CMD并发出命令“set
”,如下所示,
// Display all the variables (in NAME=VALUE pairs)
set
COMPUTERNAME=xxxxxxx
OS=xxxxxxx
PATH=xxxxxxx
.......
尝试在系统上发出“set
”命令,并研究列出的环境变量。请特别注意名为PATH的变量。
要显示特定变量,请使用命令“set varname
”或“echo %varname%
”:
// Display a particular variable
set COMPUTERNAME
COMPUTERNAME=xxxxxx
// or, use "echo" command with variable name enclosed within a pair of '%'
echo %COMPUTERNAME%
COMPUTERNAME=xxxxxx
2.2 为“Current”CMD会话设置/取消设置/更改环境变量
要设置(或更改)环境变量,请使用命令“set varname=value
”。“=”符号前后不得有空格。要取消设置环境变量,请使用“set varname=
”,即将其设置为空字符串。
set varname
:显示变量的值set varname=value
:设置或更改变量的值(注意:“=”前后没有空格)set varname=
:通过设置为空字符串删除变量(注意:“=”后面没有任何内容)set
:显示所有环境变量
例如:
// Set an environment variable called MY_VAR
set MY_VAR=hello
// Display
set MY_VAR
MY_VAR=hello
// Unset an environment variable
set MY_VAR=
// Display
set MY_VAR
Environment variable MY_VAR not defined
通过CMD下的“set
”命令设置的环境变量是本地变量,仅对当前CMD会话可用。尝试设置一个变量,重新启动CMD并查找该变量。
2.3 使用环境变量
若要在Windows中引用变量,请使用%varname%
(前缀和后缀为“%”)。例如,可以使用echo
命令以“echo %varname%
”的形式打印变量的值。
// Display the PATH environment variable
echo %PATH%
PATH=xxxxxxx
// Append a directory in front of the existing PATH
set PATH=c:\myBin;%PATH%
PATH=c:\myBin;[existing entries]
2.4 如何永久添加或更改环境变量
要在Windows中永久添加/更改环境变量(以便它对所有Windows的进程/用户可用,并在引导期间保持不变),请执行以下操作:
1. 启动“控制面板”
2. “系统”
3. “高级系统设置”
4. 切换到“高级”选项卡
5. “环境变量”
6. 选择“系统变量”(适用于所有用户)
7. 要添加新的环境变量,请执行以下操作:
a. 选择“新建”
b. 输入变量“Name
”和“Value
”。我建议您使用“Browse Directory…
”或“Browse File…
”按钮来检索所需的目录或文件,而不是键入“value
”并出错。
8. 要更改现有环境变量,请执行以下操作:
a. 选择“编辑”
b. 输入新的“值”。我建议您使用“Browse Directory…
”或“Browse File…
”按钮来检索所需的目录或文件,而不是键入“value
”并出错。
需要重新启动CMD才能使新设置生效!
要验证新设置,请启动CMD:
set VAR_NAME
VAR_NAME=VAR_VALUE
2.5 Windows中的PATH环境变量
从CMD shell启动可执行程序(文件扩展名为“.exe”、“.bat”或“.com”)时,Windows将在当前工作目录中搜索可执行程序,然后搜索PATH环境变量中列出的所有目录。如果在这些目录中找不到程序,则会出现以下错误:
// (Windows 2000/XP/Vista/7/8/10) "cmd.exe"
abc
'abc' is not recognized as an internal or external command,
operable program or batch file.
// (Windows 95/98) "command.com"
abc
Bad command or file name
要列出当前路径,请发出以下命令:
PATH
PATH=path1;path1;path3;...
2.6 如何在Windows中向路径添加目录
要将目录添加到Windows中的现有路径,请执行以下操作:
1. 启动“控制面板”
2. “系统”
3. “高级系统设置”
4. 切换到“高级”选项卡
5. “环境变量”
6. 在“系统变量”(适用于所有用户)下,选择“路径”
7. “编辑”
8. (对于较新的Windows 10)将弹出一个表,其中显示当前路径设置中包含的目录⇒“New
”⇒“Browse…
”,以选择要添加到路径中的所需目录(不要键入,否则会出现键入错误!)⇒反复单击“上移”将其移到顶部⇒“确定”(不要“取消”)⇒“确定”⇒“确定”。
9. (对于较旧的Windows)如果您没有看到弹出表,则是时候更改您的计算机了。
您需要重新启动CMD以使新的路径设置生效!
要验证新设置,请启动CMD:
PATH
PATH=path1;path2;path3;...
注意:
- Windows在搜索路径项之前先搜索当前目录(
.
)。(Unixes/macOS不搜索当前目录,除非您显式地将其包含在路径中。) - Windows使用分号(
;
)作为路径分隔符;而Unixes/macOS使用冒号(:
)。 - 如果您的目录名包含空格等特殊字符(强烈不建议),请用双引号将其括起来。
3. macOS/Linux环境变量
macOS/unix中的环境变量区分大小写。全局环境变量(对所有进程都可用)用大写字母命名,并用下划线(_)连接,例如JAVA_HOME。局部变量(仅对当前进程可用)是小写的。
3.1 在Bash Shell中使用环境变量
大多数unix(Ubuntu/macOS)都使用所谓的bashshell。在bash shell下:
- 要列出所有环境变量,请使用命令“
env
”(或“printenv
”)。还可以使用“set
”列出所有变量,包括所有局部变量。 - 若要引用变量,请使用带前缀“
$
”的$varname
(Windows使用%varname%
)。 - 要打印特定变量的值,请使用命令“
echo $varname
”。 - 要设置环境变量,请使用命令“
export varname=value
”,该命令设置变量并将其导出到全局环境(可用于其他进程)。如果值包含空格,请用双引号将其括起来。 - 要设置局部变量,请使用命令“
varname=value
”(或“set varname=value
”)。局部变量仅在此进程中可用。 - 要取消设置局部变量,请使用命令“
varname=
”,即设置为空字符串(或“unset varname
”)。
3.2 如何在Bash Shell中永久设置环境变量
您可以通过在主目录的Bash shell启动脚本“~/.bashrc
”(或“~/.Bash_profile
”或“~/.profile
”)中放置export
命令来永久设置环境变量;对于系统范围的操作,可以在“/etc/profile”中放置export
命令。请注意,默认情况下以点(.
)开头的文件是隐藏的。要显示隐藏文件,请使用命令“ls-a
”或“ls-al
”。
例如,要向PATH环境变量添加目录,请在“~/.bashrc
”(或“~/.bash_profile
”或“~/.profile
”)的末尾添加以下行,其中~
表示当前用户的主目录,或表示所有用户的“/etc/profile”。
// Append a directory in front of the existing PATH
export PATH=/usr/local/mysql/bin:$PATH
(对于Java)您可以通过添加以下行来设置CLASSPATH环境变量。例如,
export CLASSPATH=.:/usr/local/tomcat/lib/servlet-api.jar
请注意,bashshell使用冒号(:
)作为路径分隔符;而windows使用分号(;
)。
要刷新bash shell,请发出“source
”命令(或重新启动bash shell):
// Refresh the bash shell
source ~/.bashrc
// or
source ~/.bash_profile
source ~/.profile
source /etc/profile
注意:对于旧的csh(C-shell)和ksh(Korn shell)
- 使用“
printenv
”(或“env
”)列出所有环境变量。 - 使用“
setenv varname value
”和“unsetenv varname
”设置和取消设置环境变量。 - 使用“
set varname=value
”和“unset varname
”为当前进程设置和取消设置局部变量。
3.3 PATH环境变量
大多数unix和macOS在“终端”中使用所谓的bashshell。在bashshell中启动可执行程序(文件权限为executable)时,系统将在路径中列出的所有目录中搜索该程序。如果找不到该程序,将出现以下错误:
abc
bash: abc: command not found
请注意,不会搜索当前目录(.
),除非它包含在路径中。要在当前目录中运行程序,需要包含当前路径(./
),例如,
./myProgram
要列出当前路径,请发出以下命令:
echo $PATH
path1:path2:path3:...
3.4 如何在macOS/Linux中向路径添加目录
要将目录添加到macOS/Unix中的现有路径,请在其中一个启动脚本的末尾添加以下行,例如“~/.bashrc
”、“~/.login
”“~/.bash_profile
”、“~/.profile
”(其中~
表示当前用户的主目录)或“/etc/profile”(适用于所有用户)。
// Append a directory in front of the existing PATH
export PATH=/path/to/dir:$PATH
要刷新bash shell,请发出“source
”命令(或重新启动bash shell):
// Refresh the bash shell
source ~/.bashrc
// or
source ~/.bash_profile
source ~/.profile
source /etc/profile
要验证新设置,请启动CMD:
echo $PATH
path1:path2:path3:...
注意:
Unixes/macOS不搜索当前目录(.
),除非在路径中显式包含它。换句话说,要在当前目录下运行程序,需要提供目录(./
),例如:
./myProgram
通过在启动脚本中添加以下行,可以在路径中包含当前目录:
// Append the current directory (.) in front of the existing PATH
export PATH=.:$PATH
(在搜索路径之前,Windows会自动搜索当前目录(.
)。)
Unixes/macOS使用冒号(:
)作为路径分隔符;而Windows使用分号(;
)。
4. java环境变量配置 PATH、CLASSPATH、JAVA_HOME
Java应用程序安装和运行中的许多问题都是由于环境变量(在操作系统下运行的所有进程/用户都可以使用全局系统变量)的设置不正确引起的,特别是PATH、CLASSPATH和JAVA_HOME。
4.1 PATH
从命令行启动程序时,操作系统使用PATH环境变量在本地文件系统中搜索程序。换句话说,PATH维护一个目录列表,用于搜索可执行程序。
PATH(对于Windows)
从CMD shell启动可执行程序(文件扩展名为“.exe”、“.bat”或“.com”)时,Windows将在当前工作目录中搜索可执行程序,然后搜索PATH环境变量中列出的所有目录。如果在这些目录中找不到程序,则会出现以下错误:
// (Windows 2000/XP/Vista/7/8/10) "cmd.exe"
abc
'abc' is not recognized as an internal or external command,
operable program or batch file.
// (Windows 95/98) "command.com"
abc
Bad command or file name
例如,如果您试图使用Java编译器“编译工具编译Java源文件,但是编译工具在当前目录和路径中的所有目录中找不到,您将收到以下错误:
javac Hello.java
'javac' is not recognized as an internal or external command,
operable program or batch file.
PATH维护目录列表。在Windows中,目录用分号(;
)分隔。
对于Java应用程序,路径必须包括以下目录:
- JDK的“bin”(二进制)目录(例如,“c:\Program Files\java\jdk1.x.x\bin”),其中包含JDK程序,如java Compiler编译工具“和Java运行时”java.exe文件".
- “c:\windows\system32”和“c:\windows”,其中包含控制台程序和命令。
JDK的“bin”目录应该列在路径中的“c:\windows\system32”和“c:\windows”之前。这是因为一些旧的Windows系统在这些目录中提供了自己的Java运行时(通常是过时的)(请尝试搜索“java.exe文件在您的计算机中,您可能会发现一些条目)。
要将目录(比如JDK的“bin”)添加到现有路径,请选中“How To add a directory To the PATH”。
PATH(适用于macOS/Linux)
大多数unix和macOS在“终端”中使用所谓的bashshell。在bashshell中启动可执行程序(文件权限为executable)时,系统将在路径中列出的所有目录中搜索该程序。如果找不到该程序,将出现以下错误:
abc
bash: abc: command not found
例如,如果您试图使用Java编译器“javac
”来编译Java源文件,但是在路径的目录列表中找不到“javac
”,您将收到以下错误:
javac Hello.java
bash: javac: command not found
为了支持Java应用程序,需要在路径中包含JDK的“bin”(二进制)目录。请参阅上文第3章“如何将目录添加到路径”。
4.2 CLASSPATH 类路径
Java存档(JAR)文件
为了便于分发,Java类通常被归档(压缩)到一个所谓的JAR文件中。要使用第三方Java包,需要将分布式JAR文件放置在Java编译器和Java运行时可用的位置。
如何找到类?
Java编译器(“javac”)、Java运行时(“Java”)和其他Java工具按以下顺序搜索程序中使用的类:
1. Java平台(bootstrap
)类:包括核心包(Java.*
)中的系统类和扩展包(javax.*
)基础类库“(运行时类),“i18n.jar
”(国际化类),字符集.jar、jre/类等。
2. Java扩展目录:您可以将外部JAR文件复制到Java扩展目录中(这已被删除,不适用于jdk10)。
- 对于Windows,Java扩展目录位于“
<Java\u HOME>\jre\lib\ext
”(例如,“c:\Program Files\Java\jdk1.7.0{xx}\jre\lib\ext”)。 - 对于macOS,JDK扩展目录是“
/Library/Java/Extensions
”和“/System/Library/Java/Extensions
”。 - 对于Ubuntu,JDK扩展目录是“
<JAVA\u HOME>/jre/lib/ext
”(例如“/usr/user/JAVA/jdk1.7.0{xx}/jre/lib/ext”)和“/usr/JAVA/packages/lib/ext
”。
Java的扩展目录的位置保存在Java的系统属性中”java.ext.dirs
". 您可以通过系统输出打印(System.getProperty("java.ext.dirs")
).
3. 用户类搜索路径(简称类路径):按以下顺序确定:
a. 默认为当前工作目录(.
)。
b. CLASSPATH环境变量中的项,它将覆盖默认值。
c. -cp
(或-classpath
)命令行选项中的项,该选项重写classpath环境变量。
d. 运行时命令行选项-jar
,它覆盖了以上所有选项。
用户类路径保存在“Java系统属性”中java.class.path
".
建议您使用-cp
(或-classpath
)命令行选项(为每个应用程序定制),而不是为所有Java应用程序设置一个永久的类路径环境。IDE(比如Eclipse/NetBeans)为每个应用程序管理-cp(-classpath)
,并且不依赖于classpath环境。
找不到类
如果Java运行时(“Java”)无法在上述所有位置找到程序中使用的类,它将发出错误“找不到或无法加载主类”(JDK 1.7)或java.lang.NoClassDefFoundError“(JDK 1.7之前)。
类似地,Java编译器(“javac
”)将发出编译错误,例如“cannot find symbol
找不到符号”、“package does not exist
包不存在”。
注意:外部本机库(“.lib
”、“.dll
”、“.a
”、“.so
”)可以在JRE属性的路径中找到java.library.path
文件,通常但不一定包括PATH环境变量中的所有目录。否则,将出现运行时错误“java.lang.UnsatisfiedLinkError: no xxx in java.library.path
".
CLASSPATH环境变量
CLASSPATH环境变量可以包括目录(包含许多类文件)和JAR文件(类文件的单个文件存档)。如果未设置CLASSPATH,则默认为当前目录。如果设置了类路径,则必须包含当前工作目录(.
)。否则,将不搜索当前目录。
运行helloworld程序时的一个常见问题是:设置了类路径,但不包括当前工作目录。因此,不会搜索当前目录,这将导致“Could not find or load main class Hello
”找不到或无法加载主类。您只需删除类路径,并将类路径保留为默认的当前目录。
对于初学者,不需要显式的类路径设置。当前目录的默认类路径设置已足够。删除所有类路径设置(如果有)。但是,如果必须设置类路径,请确保包含当前目录“.
”。
PATH环境变量(用于搜索可执行程序)适用于所有应用程序;而CLASSPATH仅由Java使用。
CLASSPATH环境变量(适用于Windows)
类路径接受目录和jar文件。路径条目用分号(;
)分隔。
示例:显示和更改当前CMD会话的类路径。
// Display current setting of CLASSPATH
set CLASSPATH
// Set CLASSPATH to the current directory and a JAR file
set CLASSPATH=.;d:\tomcat\lib\servlet-api.jar
可以永久设置类路径。请参阅上文“如何设置环境变量”。
类路径(适用于macOS/Ubuntu)
要设置当前会话的类路径,请发出以下命令:
export CLASSPATH=.:/usr/local/tomcat/bin/servlet-api.jar
使用冒号“:
”作为路径分隔符(而不是Windows中的分号“;
”。
要永久设置类路径,请将上述export
命令放在bashshell初始化脚本中(.bashrc或.bash_profile主目录或所有用户的/etc/profile)。请参考上面的“如何设置环境变量”。
4.3 JAVA_HOME 和 JRE_HOME
许多Java应用程序(如Tomcat)都要求将环境变量JAVA_HOME设置为JDK安装目录。
如何在Windows中设置 java环境变量 JAVA_HOME
首先,检查是否已经通过start a CMD和issue设置了JAVA_HOME:
set JAVA_HOME
如果没有设置JAVA_HOME,您将收到“Environment variable JAVA_HOME not defined”。否则,将显示当前设置。
要在Windows中设置/更改JAVA_HOME,请执行以下操作:
1. 启动“控制面板”
2. “系统”
3. “高级系统设置”
4. 切换到“高级”选项卡
5. “环境变量”
6. 选择“系统变量”(适用于所有用户)
7. 要添加新的环境变量“JAVA_HOME”:
a. 选择“新建”
b. 在“变量名”中,输入“JAVA_HOME”。
c. 在“Variable Value
”中,单击“Browse Directory…
”并导航到JDK安装目录(例如,“C:\Program Files\Java\JDK-13.0.1”)。
d. OK ⇒ OK ⇒ OK。
8. 要更改现有的“JAVA_HOME”设置:
a. 选择“JAVA_HOME”⇒“编辑”
b. 在“Variable Value
”中,单击“Browse Directory…
”并导航到JDK安装目录(例如,“C:\Program Files\Java\JDK-13.0.1”)。
c. OK ⇒ OK ⇒ OK。
需要重新启动CMD才能使新设置生效!
要验证新设置,请重新启动CMD:
set JAVA_HOME
JAVA_NAME=C:\Program Files\Java\jdk-13.0.1
如何在Linux/macOS(bashshell)中设置 java环境变量 JAVA_HOME
首先,通过启动终端并发出以下命令,检查是否已设置JAVA_HOME:
echo $JAVA_HOME
JAVA_HOME将被设置为JDK安装目录。您需要找到您的JDK安装目录。
[TODO]查找macOS和Ubuntu JDK安装目录。
在“~/.bashrc
”(或“~/.login
”)的末尾添加以下行。请注意,默认情况下以点(.
)开头的文件名是隐藏的。
[TODO]如何为macOS/Ubuntu取消隐藏。
export JAVA_HOME=/path/to/JDK-installed-directory
您需要刷新bashshell以使新设置生效。发出“source
”命令,如下所示:
// Refresh the Bash Shell
source ~/.bashrc // or "source ~/.login"
// Verify the new setting
echo $JAVA_HOME
5. Windows与Unix/macOS之比较
Java是独立于平台的。Java类在Windows和Unix中运行-二进制兼容。
- unix有许多
shell
,比如较新的bash
和较旧的csh
,ksh
。Windows有两个shell
:较新的命令行年龄越大命令程序. 每个shell
都有自己的一组命令、实用程序和脚本编程语言。 - Unix的变量名表示为
$varname
,例如,$CLASSPATH
。Windows使用%varname%
,例如%CLASSPATH%
。 - Unix使用命令“
printenv
”(打印环境)或“env
”列出所有环境变量。Windows使用命令“set
”。 - Unix的路径在登录或shell初始化脚本中永久设置(例如,“
~/.login
”、“~/.profile
”、“~/.bashrc
”、“~/.bash_profile
”或“/etc/profile
”)。通过控制面板永久设置Windows路径⇒系统⇒。。。。 - 当前目录未隐式包含在Unix的路径中。要在当前目录中运行程序,需要发出“
./programName
”命令,其中“.
”表示当前目录。建议在路径中显式包含当前目录(.
)。另一方面,当前目录隐式地包含在Windows的路径中。 - Windows的路径包括驱动器号和目录。每个驱动器都有一个根目录。它使用反斜杠“
\
”作为目录分隔符(例如,“c:\jdk1.6\bin”)。Linux的路径没有驱动器号。只有一个根。Unix使用正斜杠“/
”作为目录分隔符(例如“/usr/bin/jdk1.6”)。 - Windows使用分号“
;
”作为路径分隔符(例如,在path环境变量中),而Unix使用冒号“:
”。 - Windows/DOS使用“
0D0AH
”(回车加换行)作为换行符(或行尾(EOL
)或换行符)。Unixes/macOS仅使用“0AH
”(换行)。
除特别注明外,本站所有文章均为老K的Java博客原创,转载请注明出处来自https://javakk.com/1448.html
暂无评论