4年前 (2021-02-02)  Java系列 |   抢沙发  612 
文章评分 0 次,平均分 0.0

Windows,macOS,Linux中的jdk环境变量配置

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应用程序安装和运行中的许多问题都是由于环境变量(在操作系统下运行的所有进程/用户都可以使用全局系统变量)的设置不正确引起的,特别是PATHCLASSPATHJAVA_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和较旧的cshksh。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

关于

发表评论

表情 格式

暂无评论

登录

忘记密码 ?

切换登录

注册