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 ...
随机推荐
- C语言 第三章 关系、逻辑运算与分支流程控制
目录 一.关系运算 二.逻辑运算 三.运算优先级 四.if语句 4.0.代码块 4.1.单if语句 4.2.if else 4.3.多重if 4.4.?号:号表达式 五.switch语句 一.关系运算 ...
- 在C#中interface与abstract class的区别
1)在继承抽象类时,必须覆盖该类中的每一个抽象方法,而每个已实现的方法必须和抽象类中指定的方法一样,接收相同数目和类型的参数,具有同样的返回值,这一点与接口相同. 2)当父类已有实际功能的方法时,该方 ...
- 《天书夜读:从汇编语言到windows内核编程》五 WDM驱动开发环境搭建
(原书)所有内核空间共享,DriverEntery是内核程序入口,在内核程序被加载时,这个函数被调用,加载入的进程为system进程,xp下它的pid是4.内核程序的编写有一定的规则: 不能调用win ...
- js的call() ,apply() 两种方法的区别和用法,最白话文的解释,让枯燥滚粗!
百度了一圈calll()函数和apply()函数,感觉还是糊里糊涂 正好我前几天刚又重新翻了一遍 那本 600多页 的圣经书,我习惯时不时的去打下基础,只是为了用来装逼,给人讲解....(我是有多蛋疼 ...
- css基础-语法篇
CSS基础 1.css简介 cascading style sheets 汉译层叠样式表,WEB标准中的表现标准语言,表现标准语言在网页中主要对网页信息的显示进行控制,简单说就是如何修饰网页信息 ...
- 《Metasploit魔鬼训练营》第四章(上)
p128 wmap 和昨天一样,我用这些漏洞扫描工具去扫testfire.net或者owaspbwa都扫不出漏洞!不明白! 补充:原来是网络不知道啥时候自己断了.连上后再次扫描就成功了:
- python3学习笔记(2)
一.面向对象(初识)由类和方法组成,类里面封装了很多功能,根据这个类,可以创建一个这个类的对象,即对象是根据这个类创建的,以后这个对象要使用某个功能的时候就从这个类里面的找.例:str -功能一 -功 ...
- Service 之间如何通信?- 每天5分钟玩转 Docker 容器技术(101)
微服务架构的应用由若干 service 组成.比如有运行 httpd 的 web 前端,有提供缓存的 memcached,有存放数据的 mysql,每一层都是 swarm 的一个 service,每个 ...
- 【原创】用python写的一个监测本地进程CPU占用的程序
#coding=utf-8import psutilimport sysimport timetry:#输入需要监测的进程PID PID = raw_input('ProcessPID: ') def ...
- Tomcat中虚拟路径
默认情况下,Tomcat访问静态资源配置是这样的 <Context path="/project_name" docBase="d:\tomcat_statics& ...