zoukankan      html  css  js  c++  java
  • Windows下PATH等环境变量详解(转载)

    本文转载自http://legend2011.blog.51cto.com/3018495/553255

    在学习JAVA的过程中,涉及到多个环境变量(environment variable)的概念,如PATH。正确地配置这些环境变量,是能够顺利学习、开发的前提。而经常出现的问题是:有的学习者能够按照提示一步一步地正确配置,但时间一长就忘了,出现了问题也无从下手。究其原因,就是对这些概念没有理解,知其然但不知其所以然。下面的内容,就是帮助大家知其所以然。

    一、基本原理

         首先看PATH环境变量。

         JAVA的初学者,必须要学会配置PATH环境变量,否则无法编译、运行JAVA程序。那么,为什么要配置PATH环境变量呢?PATH环境变量是做什么的呢?我们从一个常见的问题入手。

         当我们安装好JAVA后,若没有正确配置PATH环境变量,则在命令行窗口(开始->运行->输入cmd,回车)下运行命令java -version(显示JAVA的版本)命令时,会出现如下的错误提示信息:

    01

    图一

         这条错误信息的意思是,你要求运行的“java”这条命令我不认识,不知道是个什么玩意儿。那么究竟这个“java”命令是何方神圣呢?在JDK的安装目录下(我的是D:Javajdk1.6.0_24),有一个bin目录。打开此目录,会发现大量的可执行文件(后缀名为exe的文件。Windows默认隐藏文件后缀名。要显示后缀名,可在当前窗口上方菜单栏里点“工具”菜单->文件夹选项->查看->高级设置->清除“隐藏已知文件类型的扩展名”前面的钩钩->确定)  。其中有一个可执行文件即为java.exe。现在在命令行窗口下把当前目录切换到这个bin目录下。通过如下命令实现:

    02图二    

         在此目录下,运行dir命令,显示当前目录下的所有文件和目录。从显示结果中,我们可以清楚地看到“java.exe”这个文件。如下图所示:

    03

    图三    

         实际上我们执行“java”命令,就是要运行“java.exe”这个可执行文件(我们运行其他命令,本质上也是要执行某个程序文件)。我们现在再来执行“java -version”这条命令试试。在命令行窗口下键入java -version,回车,结果如下图所示:

    04图四    

         看来这次执行成功了。命令结果显示当前JAVA的版本是“1.6.0_24”。执行java -?可查看此命令的帮助信息。可以看到它有很多选项,-version只是其中之一。另外一种方式是,写出这些可执行文件的完整(绝对)路径(例如:d:Javajdk1.6.0_24injava -version),就可以在任何目录下执行了。读者可自行尝试。

         与java命令类似,javac命令目前也能在bin目录下执行,但到其他目录下就只能写出其完整路径了。在学习JAVA的过程中,我们经常需要使用javac和java这两条命令来编译、运行我们的JAVA程序。难道我们每次运行这两条命令都要先切换到bin目录下吗或写出一长串的绝对路径吗?能不能有一个办法,让我们能够在任何目录下都能自如地运行这些命令呢?

         解决的办法就在于PATH环境变量。

        PATH是路径的意思,PATH环境变量中存放的值,就是一连串的路径。不同的路径之间,用英文的分号(;)分隔开。系统执行用户命令时,若用户未给出绝对路径,则首先在当前目录下寻找相应的可执行文件、批处理文件(另外一种可以执行的文件)等。若找不到,再依次在PATH保存的这些路径中寻找相应的可执行的程序文件。系统就以第一次找到的为准;若搜寻完PATH保存的所有路径都未找到,则会显示类似于图一的错误信息。

         明白了这些,我们就把bin目录的完整路径添加到PATH中。在命令行窗口下,可使用set命令完成此类的任务。直接运行set,会显示系统当前所有环境变量的值,运行set /?,会显示关于此命令的帮助信息。使用set命令设置环境变量值的格式为:set 环境变量名=环境变量值。我们可以使用命令set path=D:Javajdk1.6.0_24in将java等程序文件所在的目录添加到PATH环境变量中(Windows下环境变量名不区分大小写,这与UNIX不同)。但是这样会使PATH的值只有“D:Javajdk1.6.0_24in”,它预先设定供其他程序使用的值就都被覆盖了。因此,我们应该把值“D:Javajdk1.6.0_24in”追加到PATH中。为此,我们可以使用如下命令:

    set path=%path%;D:Javajdk1.6.0_24in

         把PATH放在两个百分号之间,指把PATH原有的值取出。其后的分号表示分隔不同的路径值,之后才是我们要添加的值。注意,请在英文输入法状态下使用此命令。现在我们转到任意一个目录下执行java -version命令试试。结果如下图所示:

    05

    图五

         可见运行完全成功。

         但是这种使用set命令的方式设置的环境变量只对当前命令行窗口有效。一旦关闭此窗口,再次运行另一个命令行窗口时,PATH环境变量还是原来的值。因此,我们必须在Windows下修改PATH环境变量。步骤如下:

         右击桌面“我的电脑”图标->属性->高级->环境变量,就打开了了设置环境变量的对话框。上面部分是为某个用户设置。Windows设计为可多用户使用一台机器,每人一个账户。为某个账户设置的变量只对该用户有效。下面部分是设置系统变量,对系统中的每个用户有效。现在一般电脑都只有一个用户,即Administrator。因此只需要为此账户设置即可。找到PATH环境变量,点“编辑”。在“变量值”框内现有值的后面输入英文输入法的分号,然后添加你想添加的值(在这里是D:Javajdk1.6.0_24in)。一路确定,OK!

         现在再打开一个命令行窗口,输入echo %path%命令查看path的值(或者直接使用path命令亦可)。现在,我们可以看到bin目录已被添加到PATH中,再在任何目录下运行java -version命令,均可成功。如下图所示:

    06

    图六

         其实我们执行其他命令都是这个原理。举例来说,当你显示PATH的值时,你会发现第一个值是C:WINDOWSsystem32。在Windows下打开这个目录,你会看到很多可执行文件,它们的名字与我们常用的命令的名字是一致的。也就是说,我们执行这些命令,实际上系统就是根据PATH的这个值找到了相应的可执行文件,再运行这些文件的结果。如attrib.exe文件,它对应于attrib命令,这是显示/设置文件属性的命令,如下图所示:

    07

    图七

         现在我们通过命令set path=(等号右边什么都没有,或随便写点东西)来清除PATH的值,再来运行attrib命令试试。如下图所示:

    08

    图八

         可以看出,完全相同的命令,现在已无法执行而报错了。

         下面再通过命令set path=c:windowssystem32(Windows下不区分大小写,因此windows与WINDOWS都正确),把attrib.exe文件所在的路径添加到PATH中,再运行试试。如下图所示:

    09

    图九

         很显然,目前已能够正确运行。另外一个常见的例子就是format.com(.com文件是另一种可以执行的文件),不过此命令是用来格式化的,实验时请小心,不要由于失误而格式化了某个盘。而且,根据上面的描述,在PATH环境变量未正确配置的时候,写出这些文件的绝对路径(完整路径),亦可以正确执行。读者可自行实验(在此声明,由于已事先提醒,因此凡是由于误操作带来的数据丢失,概不负责!)。

    二、内部命令、外部命令和批处理文件

         我们现在启动一个命令行窗口,按上述的方法把PATH的值全部清除,然后再运行dir、cd等命令。出乎我们意料的是,它们仍然能够正确执行。这,又是什么原因呢?

         我们来看看刚才那些报告错误的信息,它们都提到了“内部命令”和“外部命令”的概念。那么什么是内部命令和外部命令呢?

         内部命令和外部命令是DOS(disk operating system,微软早期基于命令行的操作系统)时代的概念,百度百科的解释是:内部命令是随每次启动的COMMAND_COM装入并常驻内存,而外部命令是一条单独的可执行文件。粗略地讲,所谓内部命令就是最核心、使用最多的命令。为了提高响应速度,系统一启动,这些命令就被加载到内存,因此可以迅速、直接地执行;而外部命令由于使用相对较少,就不预先加载到内存,当用户使用时,再到硬盘上(c:windowssystem32)找相应的可执行文件,然后加载到内存执行。像dir、cd等都是内部命令,而诸如attrib、format等都是外部命令。尽管DOS的时代早已成为了历史,但某些操作却必须在命令行模式下完成,对专业人士来说更是如此。因此,Windows产品一直保留着命令行模式这个工具。

         另外一个概念就是批处理文件(后缀名为.bat,来源于批量的英语单词batch),它是另外一种可以执行的文件。简单地说,批处理文件包含了很多DOS命令。文件执行时,就一条一条地执行这些命令。不一定顺序执行,像通用的程序设计语言一样,它也有自己的流程控制。批处理文件创建很简单:用任何一个文本编辑器(如Windows的记事本)创建一个文本文件,然后把后缀名改为.bat即可。创建好的批处理文件,你也可以用文本编辑器打开,查看它的“源代码”。

    三、关于CATALINA_HOME环境变量的设置(适用于tomcat6/7)

         Tomcat是一个免费开源的Servlet/JSP容器,深受广大JAVA初学者喜爱。这其中需要设置CATALINA_HOME环境变量,值为tomcat安装目录(我的是d: omcat7),否则会出现如下的错误信息:

    10   图十

         这句话的意思就是没有正确设置CATALINA_HOME环境变量,而此变量是运行Tomcat所必须的。而当你不理会这个信息,在命令行窗口把当前目录切换到tomcat安装目录下的bin目录下,再执行批处理文件startup.bat来启动tomcat时,发现也可以成功。难道现在不需要CATALINA_HOME环境变量了吗?

         实际上,在startup.bat中,首先判断CATALINA_HOME是否为空。若为空,就把当前目录设为CATALINA_HOME的值。然后查找CATALINA_HOME所指示的目录下是否有个bin目录,此bin目录下是否有个叫做catalina.bat的批处理文件(此文件负责启动tomcat)。若没有,则把当前目录的父目录设为CATALINA_HOME的值,再重复上述的查找。若仍失败,就报图十所示的错误。因此,当你在tomcat安装目录下的bin目录下运行startup.bat文件时,它就会按照上面所说的第二种方式自动正确设置CATALINA_HOME的值,因为catalina.bat文件就在tomcat安装目录下的bin目录里。

         虽然在此种情况下能正确运行,但还是建议你正确设置CATALINA_HOME环境变量。与PATH不同的是,PATH系统本身就由,而CATALINA_HOME需要你自己“新建”,在“环境变量”窗口点“新建”即可。

         为了能够在任何目录下都能运行tomcat安装目录下bin目录里的批处理文件,如startup.bat,可把此目录添加到PATH环境变量中(我的是d: omcat7in)。为了提高灵活性,可在PATH环境变量的最后添加上%catalina_home%in(与前一个值之间不要忘了用英文的分号隔开)。把catalina_home放置在两个百分号之间,表示引用这个环境变量的值。这样,当你把tomcat的安装目录换了以后,就只需要修改catalina_home的值,而不需要修改PATH的值了,因为它可以自动计算出新的正确值。

    本文出自 “肖凡的专栏” 博客,请务必保留此出处http://legend2011.blog.51cto.com/3018495/553255

    2012-08-07 06:45:17
    写得非常好,java设置环境变量还要设置 JAVA_HOME CLASSPATH,不明白这两个变量是干什么用的..


    2012-08-10 17:16:42
    回复 fqogiytbn:[7楼]

    谢谢支持!JAVA_HOME的值是JDK的安装目录,例如本文中的D:Javajdk1.6.0_24。运行Tomcat需要设置此变量。另外类似于文中讲到的CATALINA_HOME,配置好JAVA_HOME后,就可以用以下方式把JDK的bin目录添加到PATH中:%JAVA_HOME%in(注意要与前面的值用英文分号分开)。这样当更改了JDK的安装目录后,就只需改JAVA_HOME,而无需改PATH了,因为操作系统可以自动算出新的bin目录。CLASSPATH,顾名思义,就是指要在哪里去寻找字节码文件(.class文件),因为我们知道JAVA程序的执行实际上是执行这些字节码文件。CLASSPATH有一点容易出错的是,若不设置,它的默认值是当前目录;而你设置后,又没有把当前目录(“.”,即英文的点)添加进去,则它就不再包含当前目录(这点与PATH不同,PATH总是包含当前目录)。这样会导致莫名其妙的找不到类的错误。因此,设置CLASSPATH时,一般先把添加当前目录,再添加其他值(不同的值之间用英文分号分开)。一般JAVA初学者不必自己设置CLASSPATH。当你需要用到第三方jar包(如JDBC驱动程序),而又没有使用eclipse、ant等开发工具,只是纯粹地使用javac、java等命令开发程序时,需要手动设置CLASSPATH。
  • 相关阅读:
    matplotlib 进阶之origin and extent in imshow
    Momentum and NAG
    matplotlib 进阶之Tight Layout guide
    matplotlib 进阶之Constrained Layout Guide
    matplotlib 进阶之Customizing Figure Layouts Using GridSpec and Other Functions
    matplotlb 进阶之Styling with cycler
    matplotlib 进阶之Legend guide
    Django Admin Cookbook-10如何启用对计算字段的过滤
    Django Admin Cookbook-9如何启用对计算字段的排序
    Django Admin Cookbook-8如何在Django admin中优化查询
  • 原文地址:https://www.cnblogs.com/zhaoweiqiu/p/3314950.html
Copyright © 2011-2022 走看看