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 ...
随机推荐
- (转)从史上八大MySQL宕机事故中学到的经验
一.Percona网站宕机事件 震级:3 发生时长:2011年7月11日 持续时长:数日 地点:加州Pleasanton(幸福屯) 宕机原因:Percona网站主服务器上的3块硬盘损坏,同时因为人员变 ...
- 以太网接口芯片W5300使用说明
一.芯片简介 引用百度百科对芯片的一个简介,我就不再赘述. W5300的目标是在高性能的嵌入式领域,如多媒体数据流服务.与WIZnet现有的芯片方案相比较,W5300在内存空间和数据处理能力等方面都有 ...
- vue-cli——vue-resource登录注册实例
前言 使用vue-resource请求接口非常方便,在使用前需安装vue-resource依赖并在入口文件main.js中声明. 实例功能简述 本实例只有简单的两个模块:登录和注册,主要演示如何用vu ...
- python 多线程批量传文件
#!/usr/bin/env python #_*_ coding:utf-8 -*-#autho:leiyong#time:2017-06-05#version: 1.3 import parami ...
- 说说css中pt、px、em、rem都扮演了什么角色
前段时间,终于仔仔细细的把pt.px.em.rem了解了一遍,简单整理了一下做个记录. pt.px.em.rem都是什么 pt单位名称为点(Point),绝对长度单位.现在网页中出现得很少甚至不出现, ...
- Mybatis查询时报 Bad format for Time '454:54:54' in column 6 异常
报 Bad format for Time '454:54:54' in column 6 解决方案:1. 查询实体类和.xml数据是否相对应 2. 查询sql是否正确 3. 查看表的设计,是 ...
- linux服务器使用yum安装nginx
一,安装nginx和php-fpm yum install nginx php-fpm 二, 找到nginx.conf find / -name nginx.conf 三,添加解析php配置 在ser ...
- Iptables详解七层过滤
<Iptables详解七层过滤> 一.防火墙简介 防火墙其实就是一个加固主机或网络安全的一个设备或者软件而已,通过防火墙可以隔离风险区域与安全区域的连接,同时不会妨碍风险区域的访问.当然需 ...
- 最大信息系数(MIC)——Detecting Novel Associations in Large Data Sets
本文介绍了一种发现两个随机变量之间依赖关系强度的度量MIC(最大信息系数,类似于相关系数的作用).MIC具有以下性质和优势: MIC度量具有普适性.其不仅可以发现变量间的线性函数关系,还能发现非线性函 ...
- C# 中枚举的一点研究(跳过一些net坑的研究而已)
之前一直使用Enum.Parse()将字符串转为枚举,没有深究,后面发现一个问题后对下面的Enum有了一个初步研究(.net 4.0).看下面代码. (留意,枚举类型是值类型,其值不能为Null,所以 ...