path和classpath细节
从学习java的最初我们就被要求先设置path变量和classpath变量。但是这两个环境变量到底有什么作用呢?
1.path环境变量
path环境变量的主要作用是告诉操作系统到哪里去寻找某个程序,如果操作系统在当前目录下找不到我们想要执行的程序,就会顺着path环境变量指定的目录去查找。最简单的一个例子,我们安装完jdk以后需要给它设置path变量。一般情况下是这样设置%JAVA_HOME%\bin;其中JAVA_HOME的值是:C:\Program Files\Java\jdk1.8.0_131。其实设置这个path,就是为了告诉系统,要去%JAVA_HOME%\bin这个地方寻找javac.exe,java.exe这两个程序。然后才能运行这两个程序。这就是path环境变量的作用。
2.javac.exe和java.exe。
这两个是java最主要的程序,javac.exe是编译器,用于将java源代码转化为.class文件;java.exe是解释器。运行javax.exe将源代码转换为.class文件,运行java.exe则将.class文件解释执行。这是由java虚拟机(JVM)来完成的。jvm解释执行类的过程比较复杂。包含载入类,校验,运行等。以后有相应的文章整理。
3.classpath环境变量。
classpath变量是告诉JVM到哪里去寻找一个类。也就是在执行java xxxx这个命令的时候去哪里寻找xxxx这个类。记得我们最初安装jdk的时候,同样设置了classpath环境变量,我们设置的值是.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar ,设置这个值的目的是为了告诉JVM,到这个目录下去寻找类。
首先.;这个目录指的是当前目录,即告诉jvm首先到当前目录去寻找类。
如果当前目录找不到,就去%JAVA_HOME%\lib中寻找,还是找不到,就去%JAVA_HOME%\lib\tools.jar寻找。我们在编写程序的时候用到很多jdk的类都需要到lib和tool.jar这两个地方寻找。只有设置了classpath变量,我们才能找到并运行相关的jdk类。
举例来说:
我们再D:/javawork下新建了一个test.java的类,首先,我们要用命令提示符将当前目录定位到D:/javawork下,然后执行javac test.java。此时在D:/javawork文件夹下面就会出现test.class这个文件。接下来我们再D:/javawork下执行java test。因为我们在classpath中设置了.;这个环境变量,jvm就会到当前目录,也就是D:/javawork去寻找test这个类,找到并执行它的代码。
假如找不到,他就得到classpath中设置的其他路径去寻找了。
总之,要运行(载入)一个类,必须到classpath下面去找到它,而classpath是我们可以设置的。
对于具有包名的类,classpath又是如何工作的呢?
假如我写了一个类,它是属于某个包,比如com.xdx.learn。则这个类的全称叫做com.xdx.learn.test。假设这个test.java文件我们目前放在D:/javawork下,此时如果我们采用javac test.java这个命令编译它,还是会在D:/javawork下生产一个test.class文件。
运行java test。失败,提示找不到test类。
这是因为此时类要加上全限定名,即com.xdx.learn.test.
那么运行java com.xdx.learn.test。依然出错,还是找不到com.xdx.learn.test。
正确的做法是,我们依次新建com文件夹,在com文件夹下建xdx文件夹,在xdx文件夹下建立learn文件夹,然后再把test.class这个文件放入learn文件夹下。执行ava com.xdx.learn.test。此时才是成功的。
jvm在装载带有包名的类的时候,会从classpath中找到路径(本例是当前目录,即D:/javawork),然后去寻找顶层包名所对应的的物理目录(本例是com文件夹),然后按照包名的顺序依次寻找对应的目录,在最底层包名中找到test.calss文件。所以classpath的设置一定要指向顶级包名所对应的目录(com文件夹)的父目录(D:/javawork)。而非指向test.calss所在的目录。这一点至关重要。
ps:其实有个小窍门,我们在编译的时候就可以生成包名所对应的的物理目录,只要使用如下命令。javac -d . test.java。就可以生成与包名对应的物理目录。
4.import
import是引入包中的类,比如我们想要用到某个类,但是这个类跟当前的类不在同一个包中,我们就需要使用import关键字。
需要知道的是,你要引入某个类,即使用import去引入,它必须已经被jvm所装载。我们在编写web项目的时候,总是引用很多外部的jar包,有jdk的,有tomcat目录下的,还有web-inf/lib下的。所以我们该知道,在装载我们自己编写的类之前,jvm首先要装载这三个地方的类。否则import就不会起作用了。
jar包是编译后的.class文件打包而成,其下面有包目录,只要我们将classpath设置为包含某一个jar包所在的路径,就可以运行其里面所包含的的类。比如a.jar包下面有com.xdx.learn、com.xdx.study等包,这些包下面又有一些编译好的.class文件。那么把classpath设为a.jar包所在路径,就可以执行com.xdx.learn、com.xdx.study包下的类了。
path和classpath细节的更多相关文章
- Java设置环境变量的含义(JAVA_HOME,PATH,CLASSPATH)
开发Java程序之前,需要在计算机行安装并配置Java开发环境.一种是直接安装Myeclipse,利用其自带的JDK编译运行:另一种是在我们的Windows或者Linux平台下安装JDK,配置环境变量 ...
- path和classpath
对于Java的初学者,这两个环境变量,总是要遇到的.这里做一下总结. 1.path和classpath的含义 path是Windows操作系统的一个环境变量. 当操作系统需要运行一个程序,它需要知道该 ...
- java中path和classpath
Path 路径,是java编译时需要调用的程序(如java,javac等)所在的地方; CLASSPATH的作用是指定查找类的路径:当使用java命令执行一个类(类中的main方法)时,会从class ...
- JDK PATH 和 CLASSPATH环境变量的作用及其配置
(1)PATH环境变量的作用 在安装JDK程序之后,在安装目录下的bin目录中会提供一些开发Java程序时必备的工具程序. 对于Java的初学者,建议在命令符模式下使用这些工具程序编译运行Java程序 ...
- linux环境下安装jdk(本文示例是jdk1.6.0_export JAVA_HOME=/usr/java/jdk1.6.0_45 export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar45)
第一步:创建一个文件夹安装jdk(虽说地址一般自定义,但是为了方便查找请按照笔者建议目录 ):/usr/java 将jdk-6u45-linux-x64.bin文件放到 /usr/java 文件夹 ...
- 设置PATH和CLASSPATH
每天玩java的,如果连这门语言背景一点都熟悉的话,说出去真的是挺丢人的一件事情. 首先,java具有最强大的2个特点:功能强大,简单易用.出去android不说,这门语言衍生出太多的开源框架了,这也 ...
- path和classpath的区别
path的作用 path是系统用来指定可执行文件的完整路径,即使不在path中设置JDK的路径也可执行JAVA文件,但必须把完整的路径写出来,如C:\Program Files\Java\jdk1.6 ...
- Java环境变量PATH和CLASSPATH
Java开发中常用到环境变量的配置,下面简单介绍下Java中经常配置的环境变量:PATH和CLASSPATH. 1.PATH环境变量 1.1 作用简介 安装完JDK(Java Development ...
- 环境变量配置的作用和区别:Path、Classpath、JAVA_HOME
环境变量配置的作用和区别:Path.Classpath.JAVA_HOME 一个是零时配置,另一个是永久性配置. 零时配置的方法: 打开cmd窗口——>输入set命令,回车——>输入set ...
随机推荐
- 【Tesseract】Tesseract API在VS 2013中的配置以及调用
想要在VS中使用Tesseract库,必须使用经过相对应的VS版本编译过的dll以及lib.比如在VS 2013中,就必须使用在VS 2013中编译过的Tesseract库. 这里我给出经过VS 20 ...
- [转载] Dubbo实现RPC调用使用入门
转载自http://shiyanjun.cn/archives/341.html 使用Dubbo进行远程调用实现服务交互,它支持多种协议,如Hessian.HTTP.RMI.Memcached.Red ...
- 学会WCF之试错法——安全配置报错分析
安全配置报错分析 服务端配置 <system.serviceModel> <bindings> <wsHttpBinding> <binding name = ...
- Mysql相关知识点总结(一)
information_schema库:information_schema库中的表大都是temporory表,都是只读的,不能进行更新.删除和插入等操作,也不能加触发器,因为它们实际只是一个视图,不 ...
- javascript常用的Math对象的方法
简介 Math对象是在程序编程中用于执行一些数学任务的.Math 对象并不像 Date 和 String 那样是对象的类,因此没有构造函数 Math(),像 Math.sin() 这样的函数只是函数, ...
- ES7前端异步玩法:async/await理解
在最新的ES7(ES2017)中提出的前端异步特性:async.await. 什么是async.await? async顾名思义是"异步"的意思,async用于声明一个函数是异步的 ...
- asp.net core 实现一个简单的仓储
一直有自己写个框架的想法,但是一直没有行动起来,最近比较闲,正好可以开工了. 现在已经完成了两部分.1.一个简单仓储,实现使用的是ef 2.IOC部分,这里是把内置的ioc替换成了aotofac,这部 ...
- 2719:陶陶摘苹果-poj
2719:陶陶摘苹果 总时间限制: 1000ms 内存限制: 65536kB 描述 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果.苹果成熟的时候,陶陶就会跑去摘苹果.陶陶有个30厘米 ...
- XSD详解二 - 简易元素、属性、内容限定
一.XSD 简易元素 XML Schema 可定义 XML 文件的元素. 简易元素指那些只包含文本的元素.它不会包含任何其他的元素或属性. 1.什么是简易元素? 简易元素指那些仅包含文本的元素.它不会 ...
- Django的ModelForm组件
创建类 from django.forms import ModelForm from django.forms import widgets as wd from app01 import mode ...