Java——环境变量的配置

理解环境变量

以Windows 7为操作系统载体来讲解Java。而在开发Java程序之前,通常需要先在Windows操作系统中配置好有关Java的系统环境变量(Environment Variable)。

在介绍环境变量的含义之前,我们先举一个形象的例子,给读者一个感性的认识。比如我们喊一句:“张三,你妈妈喊你回家吃饭!”可是“张三”为何人?他在哪里呢?对于我们人来说,认不认识“张三”都能给出一定的响应,如认识他,可能就会给他带个话;而不认识他,也可能帮忙吆喝一声“张三,快点回家吧!”

然而,对于操作系统来说,假设“张三”代表的是一条命令,它不认识“张三”是谁,也不知道“它”来自何处,它会“毫无情趣”的说,我“不认识“张三”: “not recognized as aninternal or external command,然后拒绝继续服务。

为了让操作系统“认识”张三,我们必须给操作系统有关张三的精确信息,如“XXX省YYY县ZZZ乡QQQ村张三”,但其他的问题又来了,如果“张三”所代表的命令是用户经常用到的,每次使用“张三”,用户都在终端敲入“XXX省YYY县ZZZ乡QQQ村张三”,这是非常繁琐的,能不能有简略的办法呢?聪明的系统设计人员想出了一个简易的策略——环境变量。把“XXX省YYY县ZZZ乡QQQ村”设置为常见的“环境”,当用户在终端仅仅敲入“张三”时,系统自动检测环境变量集合里有没有“张三这个人,如果在”“XXX省YYY县ZZZ乡QQQ村”找到了,就自动替换为一个精确的地址“XXX省YYY县ZZZ乡QQQ村张三”,然后继续为用户服务。如果整个环境变量集合里都没有“张三”,那么再拒绝服务,如下图所示。
在这里插入图片描述
操作系统里没有上/下行政级别的概念,但却有父/子文件夹的概念,二者有“曲艺同工”之处。对“XXX省YYY县ZZZ乡QQQ村”这条定位“路径”,操作可以用“/”来区分不同级别文件夹,即:”“XXX省/YYY县/ZZZ乡/QQQ村””,而“张三”就像这个文件夹下的命令文件。

下面给出环境变量的正式定义。

环境变量是指在操作系统指定的运行环境中的一组参数,它包含一个或多个应用程序使用的信息。环境变量一般是多值的,即一个环境变量可以有多个值,各个值之间以英文状态下的分号“;”(即半角的分号)分隔开来。

对于Windows等操作系统来说,一般都有一个系统级的环境变量Path(路径)。当用户要求操作系统运行一个应用程序,却没有指定应用程序的完整路径时,操作系统首先会在当前路径下寻找该应用程序,如果找不到,便会到环境变量路径“Path”指定的路径下寻找。若找到该应用程序则执行它,否则会给出错误提示。用户可以通过设置环境变量来指定自己想要运行的程序的所在位置。

例如,编译Java程序需要用到javac命令,运行Java程序需要java命令。而这两个命令并不是Windows系统自带的命令,所以用户需要通过设置环境变量(JDK的安装位置)来指定这两个命令的位置。设置完成后就可以在任意目录下使用这两个命令了,而无需每次都要输入这两个命令的所在的精确全路径(如C:\ProgramFiles\Java\jdk1.8.0_05)。javac和java等命令都放在JDK安装目录的bin目录下。基于类似于环境变量“Path”相同的理由,我们需要掌握JDK中最重要的3个环境变量,下面一一给予介绍。

配置JDK中的3个环境变量

对于环境变量中相关变量的深刻理解极为重要,特别是ClassPath,在日后的Java学习开发过程中会发现,很多问题的出现都与ClassPath环境变量有关。在学习如何配置这些环境变量之前,很有必要深刻理解下面3个环境变量代表的含义。

⑴ JAVA_HOME:顾名思义,”JAVA的家“——该变量是指安装Java的JDK路径,它告知操作系统在哪里可以找到JDK。

⑵ Path:前文已经有所介绍。该变量是告诉操作系统可执行文件的搜索路径,即可以在哪些路径下找到要执行的可执行文件,请注意它仅对可执行文件有效。当运行一个可执行文件时,用户仅仅给出该文件名,操作系统首先会在当前目录下搜索该文件,若找到则运行它,若找不到该文件,则根据Path变量所设置的路径,逐条到Path目录中搜索该可执行文件。

⑶ ClassPath:该变量是用来告诉Java解释器(即java命令)在哪些目录下可找到所需要执行的class文件(即javac编译生成的字节码文件)。

  1. JAVA_HOME的配置

下面我们详细说明Java的环境变量配置流程。

⑴ 在桌面中右击【我的电脑】,在弹出的快捷菜单中选择【属性】选项,
在这里插入图片描述

⑵ 在弹出的界面左上方,选择【高级系统设置】选项,如下图所示。
在这里插入图片描述

⑶ 单击【高级系统设置】选项后弹出【系统属性】对话框,然后单击【高级】->【环境变量】,如下图所示。
在这里插入图片描述

⑷ 在【环境变量】对话框中,单击【系统变量】下的【新建】按钮,显示如下图所示。
在这里插入图片描述

⑸ 在【编辑系统变量】对话框中输入,变量名为:“JAVA_HOME”,变量值为:C:\ProgramFiles\Java\jdk1.8.0_05。特别需要读者注意的是,这个路径的具体值是根据读者安装JDK的路径而定,读者把Java安装在哪里,就把对应的安装路径放置于环境变量之内,不可拘泥于本书演示的这个路径值。然后,单击【确定】按钮,如下图所示。
在这里插入图片描述
注意
假设JDK安装在“C:\ProgramFiles\Java\jdk1.8.0_05”,在设置完毕对应的环境变量JAVA_HOME后,以后再要用到这个变量时,需用两个%将其包括起来。如要设置另外一个环境变量值为“C:\ProgramFiles\Java\jdk1.8.0_05\bin”,那么我们可以简单的用“%JAVA_HOME%\bin”代替即可。

2. Path的配置

. ⑴ 选中系统环境变量中的Path,单击【编辑】按钮,如下图所示。
在这里插入图片描述
⑵ 在弹出的【编辑系统变量】对话框的【变量值】文本框中,在文本框的末尾添加:“;%JAVA_HOME%\bin”,特别注意不要忘了前面的分号“;”,然后单击【确定】按钮,返回【系统属性】对话框,如下图所示。这里的%JAVA_HOME%就是指代前面设置的“C:\Program Files\Java\jdk1.8.0_05”,这里主要是为了方便起见,避免每次引用这个路径都输入很长的字符串。如果不怕麻烦,“;%JAVA_HOME%\bin”完全可以用全路径“;C:\Program Files\Java\jdk1.8.0_05\bin”代替之。这个路径务必设置正确,因为诸如Java语言的编译命令javac和解释命令java等都是在这个路径下,设置失败,这些命令将无法找到。注意:Path路径都是系统路径,配置的过程中要小心,以防无意删掉,最好先备份到文档中。
在这里插入图片描述
注意
当Path有多个变量值时,一定要用半角(即英文输入法)下的“;”将多个变量值区分开。初学者很容易犯错的地方:(1)忘记在上一个Path路径值前面添加分号“;”(2)没有切换至英文输入法,误输入中文的分号“;”。英文分号是1个字节大小,而中文的分号是2个字节大小。

⑶ 在【系统属性】对话框中单击【确定】按钮,完成环境变量的设置,如下图所示。
在这里插入图片描述
请注意,检测环境变量是否配置成功,在命令行模式下,在任意目录下用javac命令来检验,如果能输出javac的用法提示,则说明配置成功,如下图所示。
在这里插入图片描述
进入命令行模式的方法是,单击Windows 7的【开始】菜单,在搜索框中输入CMD命令,然后回车即可。

3. ClassPath的指定
. ClassPath的设定对初学者来说,有一定的难度,容易配错。如果说JAVA_HOME指定的是java命令的运行路径的话,那么ClassPath指定的就是java加载类的路径,只有类在ClassPath中,java命令才能找到它,并解释它。
在Java中可以使用“set classpath”命令指定Java类的执行路径。下面通过一个例子来了解一下classpath的作用,假设这里的“Hello.class”类位于“C:\”目录下。

在“D:\”目录下的命令行窗口执行下面的指令。
在这里插入图片描述
之后在“D:\”目录下执行“java Hello”命令,如下图所示。
在这里插入图片描述
从上图所示的输出结果可以发现,虽然在“D:\”目录中并没有“Hello.class”文件,但是也可以用“java Hello”执行“Hello.class”文件。之所以会有这种结果,就是因为在“D:\”目录中使用了“set classpath”命令,它把类的查找路径指向了“C:\”目录,在运行java时,会从ClassPath 中查找这个Hello类文件,而ClassPath 中包括了“C:\”,所以运行成功。

注意
在设置classpath时,最好将classpath指向当前目录,即所有的class文件都从当前文件夹中开始查找:“set classpath=.”。在命令行输入命令时,不包括上面的引号“ ”。在Windows及Linux等操作系统下,一个点“.”代表当前目录,两个点“…”代表上一级目录。

但是这样的操作行命令操作模式,实际上又会造成一种局限:每一次启动命令行窗口所设置的ClassPath都只是针对于当前命令行窗口有效。一旦重新开启命令行窗口,或系统重启,命令行临时设置的ClassPath中变量值都丢失了。如果想“一劳永逸”,最好的办法还是将ClassPath设置为环境变量。

⑴ 参照JAVA_HOME的配置,在【环境变量】对话框中,单击【系统变量】下的【新建】按钮,如下图所示。新建一个环境变量,变量名为:CLASSPATH,变量值为:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar。注意不要忽略了前面的 “.” ,这里的小点“.”代表的是当前路径,既然是路径,自然也需要用分号“;”隔开。JDK的库所在包即tools.jar,所以也要设置进ClassPath中。
在这里插入图片描述
注意
Windows系统环境下,一般只要设置好JAVA_HOME就可以正常运行Java程序。默认的ClassPath是当前路径(即一个点 “.”)。有些第三方的开发包,需要使用到环境变量ClassPath,只有这样才能够使用JDK的各种工具。Windows下不区分大小写,ClassPath和CLASSPATH是等同的,可根据习惯自己选择大小写

⑵ 在按照步骤⑴设置后,如果在Java类(即.class)文件所存储的当前路径下,那么用“java+类名”方式解释执行用户类文件,这是没有问题的。但是如果用户更换了路径,现在的“当前路径”里没有在.class文件,那么“java”就无法找到这个类文件。

这时,即使在命令行下给出.class文件所在的全路径,java依然会出错,这会让初学者很困惑。下面具体说明,假设Java文件Hello.java存在在“D:\src\chap01\”路径下,由于JAVA_HOME和Path环境变量正确,用户可以正确编译、运行,使用javac和java命令无误,如下图所示。
在这里插入图片描述
但是如果用户切换了路径,比如使用“cd”命令切换至“D:\src\”,再次用java运行Hello类文件,就会得到错误信息:“Error: Could not find orload main class TestJava2_1”,如下图所示。这是因为Java在ClassPath里找不到Hello.class,因为现在的这个当前路径(也就是那个“.”代表的含义)已经变更为“D:\src\”,而“D:\src\”路径下确实没有Hello.class这个文件。
在这里插入图片描述
⑶ 最后,参照环境变量Path的配置,将环境变量CLASSPATH添加到Path的最后,如下图所示。CLASSPATH是环境变量,在另外一个地方作为变量使用时,要用两个%将该变量前后包括起来。
在这里插入图片描述
如果用户原来的命令行终端窗口一直开启着,则需要关闭再重启命令行窗口,这是因为需要重新更新命令行窗口的环境变量。之后,就可以在任意路径下执行用户自己的类文件,如下图所示。
在这里插入图片描述

编写Hello.java程序

在这里插入图片描述
将上面的程序保存为“Hello.java”文件。行号是为了让程序便于被读者(或程序员)理解而人为添加的,真正Java源代码是不需要这些行号的。在命令行中输入“javac Hello.java”,没有错误后输入“java Hello”。运行结果如下图所示,显示“Hello World!”。
在这里插入图片描述
Java程序运行的流程可用如右图来说明:所有的Java源代码(以.java为扩展名),通过Java编译器javac (javac命令中字母c来自于compiler的首字母)编译成字节码,也就是以.class为扩展名的文件。然后利用命令java将对应的字节码通过Java虚拟机(JVM)解释为特定操作系统(如Windows、Linux等)能理解的机器码,最终Java程序得以执行。

在这里插入图片描述
这里需要注意的是,此处的java命令在Windows操作系统下,不区分大小写,诸如java 和JavA都是等同的。而在Linux等类UNIX系统下,由于区分大小写,javac和java命令等的所有命令字符都必须小写。
下面我们来解读一下这个Java小程序,对Java程序有个初步的认知。

第1行。public 是一个关键字,用于声明类的权限,表明这是一个公有类(class),其他任何类都可以直接访问它。class 也是Java的一个关键字,用于类的声明,其后紧跟的就是类名,这里的类名称是Hello。

第2行和第9行。这一对大括号{}标明了类的区域,在这个区域内的所有内容都是类的一部分。

第3行和第6行。这两行为注释行,可以提高程序的可读性。注释部分不会被执行。这种注释属于单行注释,要求以双斜线//开头,后面的部分均为注释。

第4行。这是一个main方法,它是整个Java程序的入口,所有的程序都是从public static voidmain(String args[])开始运行的,该行的代码格式是固定的。String args[]不能漏掉,如果漏掉,在一些编辑器中,如Eclipse,该类不能被识别执行。另外String args[]也可以写成String [] args,String为参数类型,表示为字符串型,args是arguments(参数)的缩写。public 和static都是Java的关键词,它们一起表明main是公有的静态方法。void也是Java的关键词,表明该方法没有返回值。

第5行和第8行是main方法的开始和结束标志,它们声明了该方法的区域,在{}之内的语句都属于main方法。

第7行System.out.println是Java内部的一条输出语句。引号内部的内容"Hello World !"会在控制台中打印出来。

探秘Java虚拟机(JVM)

我们看到Java编译器——javac仅仅将源代码编译成.class文件,然后通过命令java将.class文件送往Java虚拟机(JVM),变成最终可执行的程序。下面我们就Java虚拟机的机制进行简单的讨论。

Java中的虚拟机的概念,可以看作是在机器和编译程序之间加入了一层抽象的虚拟机器。这台虚拟的机器在任何平台上都提供给编译程序一个共同的接口。编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由解释器来将虚拟机代码转换为特定系统的机器码执行。在Java中,这种供虚拟机理解的代码叫做字节码(ByteCode),它不面向任何特定的处理器,只面向虚拟机。每一种平台的解释器是不同的,但是实现的虚拟机却是相同的。

Java程序得以执行的环境称之为Java运行时环境(Java Runtime Environment, 简称JRE),它由Java的虚拟机JVM和Java 的API构成。一个Java程序若想运行在Java虚拟机之中,源代码的语句需由Java编译器编译成字节码。字节码本质上是一种标准化的可移植的二进制格式。该格式以Java类文件(.class)的形式存在。一个Java程序可有多个不同的.class文件构成。在早期发布大型的Java程序,通常把多个.class文件打包成一个发布文件.jar,其扩展名来自于“java archive”(java 归档文件)的简写。
在这里插入图片描述
Java虚拟机在执行.class或jar文件时,使用到“即时编译器”(JIT compiler,just-in-timecompiler)。“即时编译器”是一个把Java的字节码(包括需要被解释的指令的程序)转换成可以直接发送给处理器(processor)指令的程序。本质上,“即时编译器”是Java程序的第二个编译器,它能把通用的字节码编译成特定系统的机器指令代码。但是这里的二次编译,对用户来说基本上是“透明的”—即它存在但用户无需感知。
值得一提的是,另外一种网络编程常见语言—Python,也可以通过jpython(Python的纯java实现版本)编译后,同样也生成Java编译生成一样的字节码,从而也大大提供了该类程序的可移植性。

认识Java程序的框架

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值