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 ...
随机推荐
- fio——IO基准测试
简介 fio是IO工具,既可以用于基准测试,也可以用于硬件的压力测试验证(stress/hardware verification). 支持13种不同的IO引擎(sync.mmap.libaio.po ...
- Python之多进程篇
Process 创建子进程执行指定的函数 >>> from multiprocessing import Process,current_process >>> & ...
- YII 多表联查 纵表
A id 与B a.id B id 与C b.id C id 与D c.id 查A读D数据 应用场景: order表 ordergoods表 goods表 merchant加盟商 order 与ord ...
- html5+ XMLHttpRequest
XMLHttpRequest 让发送一个HTTP请求变得非常容易.你只需要简单的创建一个请求对象实例,打开一个URL,然后发送这个请求.当传输完毕后,结果的HTTP状态以及返回的响应内容也可以从请求对 ...
- 华南师大 2017 年 ACM 程序设计竞赛新生初赛题解
题解 被你们虐了千百遍的题目和 OJ 也很累的,也想要休息,所以你们别想了,行行好放过它们,我们来看题解吧... A. 诡异的计数法 Description cgy 太喜欢质数了以至于他计数也需要用质 ...
- springboot-mybatis 批量insert
springboot mybatis 批量insert 操作 直接上代码: 1.首先要在pom.xml中导入包: 略...... 2.springboot mybatis配置: package com ...
- Tomcat在修改代码后不会自动reload解决办法
1.找到使用的Tomcat安装目录conf配置文件夹下context.xml文件 2.找到<Context>节点,改为<Context reloadable="true&q ...
- C语言一些知识点总结
一.关键字 1. 什么是关键字 1> 关键字就是C语言提供的有特殊含义的符号,也叫做“保留字” 2> C语言一共提供了32个关键字,这些关键字都被C语言赋予了特殊含义 auto doubl ...
- Java计算字符串中字母出现的次数
话不多说,直接上代码........... public static void main(String[] args) { String str="I'm go to swimming&q ...
- strlen 与 sizeof
#include<stdio.h>#include<string.h>#include<string>#include<iostream>using n ...