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 ...
随机推荐
- mac下安装HTMLTestRunner
HTMLTestRunner是Python标准库unittest模块的一个扩展.它生成易于使用的HTML测试报告. 1.下载HTMLTestRunner.py模块地址 http://tungwaiyi ...
- webStorm恢复误删除文件或工程
背景: 提交git时可能由于没有提交所有文件,不知什么原因导致最近几天所写文件全部消失,所改文件全部恢复到以前.最终通过webstorm找回项目.下面总结通过webstorm找回误删文件,或恢复到历史 ...
- bash, sh, dash 傻傻分不清楚
原文链接,转载请注明出处: http://www.happycxz.com/m/?p=137 常见shell类型 Bourne shell (sh) UNIX 最初使用,且在每种 UNIX 上都可以使 ...
- ServerSocket(TCP/IP协议)__Java
服务器端 //参数为端口号,可以自定义 ServerSocket ss=new ServerSocket(11111); System.out.println("开启监听..." ...
- Spring的69个知识点
目录 Spring 概述 依赖注入 Spring beans Spring注解 Spring数据访问 Spring面向切面编程(AOP) Spring MVC Spring 概述 1. 什么是spri ...
- python进阶------进程线程(五)
Python中的IO模型 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别 ...
- 【转】Entity Framework 5.0系列之约定配置
Code First之所以能够让开发人员以一种更加高效.灵活的方式进行数据操作有一个重要的原因在于它的约定配置.现在软件开发越来复杂,大家也都试图将软件设计的越来越灵活,很多内容我们都希望是可配置的, ...
- Java中static关键字的详解
static关键字可以修饰方法和成员变量(不可以修饰局部变量,但是可以修饰内部类). static关键字方便在没有创建对象的情况下来进行调用(方法/变量). 很显然,被static关键字修饰的方法或者 ...
- replace() 所有单词首字母大写
function ReplaceDemo() { var r,re; var s="The quick brown fox jumpe dover the lazy yellow dog.& ...
- Struts2-046验证脚本
下面分享一下Struts2-046验证的python脚本 #encoding:utf-8 import urllib2 from poster.encode import multipart_enco ...