Java开发中常用到环境变量的配置,下面简单介绍下Java中经常配置的环境变量:PATH和CLASSPATH。

1、PATH环境变量

1.1 作用简介

安装完JDK(Java Development Kit,Java开发套件)之后,可以在安装目录下找到两个子目录(bin目录和lib目录)。bin目录中包含着Java编译器等可执行文件。

如果要运行执行java命令,必须得执行java命令对应的可执行文件的路径,通常有两种方式:

  • 在%JAVA_HOME%目录下执行。
  • 执行命令的时候,指明路径%JAVA_HOME%/bin/java

但是,这样不是特别方便,这就是为什么配置环境变量。如果将%JAVA_HOME%/bin/,添加到环境变量PATH中。再执行java命令时(无论在哪个目录下执行),系统就会从左到右搜索(这里的顺序很重要,可以利用这个特性覆盖掉某个旧版本的jdk。)环境变量PATH中执行的目录,直到找到对应的可执行文件并执行(找到之后,后面的目录都会被忽略掉)。如果找不到,提示该命令不存在。这就是PATH环境变量的作用。

1.2 如何配置

另外,由于JDK的安装目录中的%JAVA_HOME%/jre/bin目录下也有一些常用的工具,所以一般也将其配置到PATH环境变量中。同时,在配置java环境的同事,不能影响其它环境的运行。所以,以windows下面环境变量的配置(各个目录之间用;隔开)为例,通常将下面的内容加到PATH环境变量的最左侧:

%JAVA_HOME%/bin/;%JAVA_HOME%/jre/bin

2、CLASSPATH环境变量

2.1 作用简介

和PATH变量不同,CLASSPATH环境变量的作用是指定Java类所在的目录(或许它的意思就是PATH of Class)。
当运行java程序的时候,要指定相应的类名,比如,下面的例子中,在C:\test\目录下写一个HelloWorld,并执行:

c:\test>type HelloWorld.java   #查看文本文件的内容
public class HelloWorld{
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("Hello World!!");
}
}
c:\test>javac HelloWorld.java #因为配置了PATH环境变量,在任意目录下都可执行javac c:\test>dir #查看编译生成的class文件
2016/03/28 22:13 427 HelloWorld.class
2016/03/28 22:08 152 HelloWorld.java
c:\test>java HelloWorld #运行HelloWorld(注意,不能加.class后缀)
错误: 找不到或无法加载主类 HelloWorld

这里报错找不到或无法加载主类 HelloWorld,前面说到

CLASSPATH环境变量的作用是指定Java类所在的目录。

下面看下此时环境中CLASSPATH环境变量的值是什么:

c:\test>echo %CLASSPATH%
C:\Program Files\Java\jdk1.8.0_51\lib\tools.jar;C:\Program Files\Java\jdk1.8.0_51\lib\dt.jar
c:\test>

果真,没有HelloWorld.class所在的目录。下面我们通过手动指定CLASSPATH解决该问题:

c:\test>java -classpath . HelloWorld
Hello World!!
c:\test>

实际上,和PATH环境变量也是由左到右搜索的,所以,在向CLASSPATH中添加新的目录时,通常将其放在最左侧。下面的例子中,在指定-classpath选项的参数时,引用了%CLASSPATH%环境变量:

c:\test>java -classpath .;%CLASSPATH% HelloWorld
错误: 找不到或无法加载主类 Files\Java\jdk1.8.0_51\lib\tools.jar;C:\Program
c:\test>java -classpath ".;%CLASSPATH%" HelloWorld
Hello World!!
c:\test>echo ".;%CLASSPATH%"
".;C:\Program Files\Java\jdk1.8.0_51\lib\tools.jar;C:\Program Files\Java\jdk1.8.0_51\lib\dt.jar"

ps:如果刚装完JDK,没有配置环境变量,那么缺省的%CLASSPATH%环境变量的值是.,也就是当前目录。

2.2 通常如何配置

Java中通常将环境变量CLASSPATH配置为.;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\dt.jar。其中为何包含.,在上面的例子中已经看得很清楚了。下面的内容大概介绍了另外两个的作用:

dt.jar:运行环境类库,主要是Swing包,这一点通过用压缩软件打开dt.jar也可以看到。如果在开发时候没有用到Swing包,那么可以不用将dt.jar添加到CLASSPATH变量中。

tools.jar:工具类库,它跟我们程序中用到的基础类库没有关系。我们注意到在Path中变量值bin目录下的各个exe工具的大小都很小,一般都在27KB左右,这是因为它们实际上仅仅相当于是一层代码的包装,这些工具的实现所要用到的类库都在tools.jar中,用压缩软件打开tools.jar,你会发现有很多文件是和bin目录下的exe工具相对性的,如下图:

From:The use of CLASSPATH

 

2.3 指定CLASSPATH的注意事项

Class Path Wild Cards

Class path entries can contain the base name wildcard character (), which is considered equivalent to specifying a list of all of the files in the directory with the extension .jar or .JAR. For example, the class path entry mydir/ specifies all JAR files in the directory named mydir. A class path entry consisting of * expands to a list of all the jar files in the current directory. Files are considered regardless of whether they are hidden (have names beginning with '.').
A class path entry that contains an asterisk () does not match class files. To match both classes and JAR files in a single directory mydir, use either mydir:mydir/ or mydir/:mydir. The order chosen determines whether the classes and resources in mydir are loaded before JAR files in mydir or vice versa.
Subdirectories are not searched recursively. For example, mydir/
searches for JAR files only in mydir, not in mydir/subdir1, mydir/subdir2, and so on.
The order in which the JAR files in a directory are enumerated in the expanded class path is not specified and may vary from platform to platform and even from moment to moment on the same machine. A well-constructed application should not depend upon any particular order. If a specific order is required, then the JAR files can be enumerated explicitly in the class path.
Expansion of wild cards is done early, before the invocation of a program's main method, rather than late, during the class-loading process. Each element of the input class path that contains a wildcard is replaced by the (possibly empty) sequence of elements generated by enumerating the JAR files in the named directory. For example, if the directory mydir contains a.jar, b.jar, and c.jar, then the class path mydir/* is expanded into mydir/a.jar:mydir/b.jar:mydir/c.jar, and that string would be the value of the system property java.class.path.
The CLASSPATH environment variable is not treated any differently from the -classpath or -cp options. Wild cards are honored in all of these cases. However, class path wild cards are not honored in the Class-Path jar-manifest header.

Folders and Archive Files

When classes are stored in a directory (folder), such as c:\java\MyClasses\utility\myapp, then the class path entry points to the directory that contains the first element of the package name (in this case, C:\java\MyClasses, because the package name is utility.myapp).
When classes are stored in an archive file (a zip or JAR file) the class path entry is the path to and including the zip or JAR file. For example, the command to use a class library that is in a JAR file as follows:

java -classpath C:\java\MyClasses\myclasses.jar utility.myapp.Cool

Multiple Specifications

To find class files in the directory C:\java\MyClasses and classes in C:\java\OtherClasses, you would set the class path to the following. Note that the two paths are separated by a semicolon.

java -classpath C:\java\MyClasses;C:\java\OtherClasses ...

Specification Order

The order in which you specify multiple class path entries is important. The Java interpreter will look for classes in the directories in the order they appear in the class path variable. In the previous example, the Java interpreter will first look for a needed class in the directory C:\java\MyClasses. Only when it does not find a class with the proper name in that directory will the interpreter look in the C:\java\OtherClasses directory.

From: docs.oracle.com

3、JAVA_HOME环境变量

这个是不重要的,题目中我都没有提它。它唯一的作用就是,前面两个环境变量的配置中引用了它,所以,要将其配置为:

C:\Program Files\Java\jdk1.8.0_51\

如果前面环境变量的配置都显式指定了完成的路径,那么完全可以不用配置JAVA_HOME环境变量。

转载自:https://www.jianshu.com/p/d63b099cf283

Java环境变量PATH和CLASSPATH的更多相关文章

  1. java环境变量 Path 与CLASSPATH

    1.Windows操作系统根据Path环境变量来查找命令,Linux操作系统则根据PATH环境变量来查找命令 因为Windows操作系统不区分大小写,设置Path和PATH并没有区别,而Linux系统 ...

  2. Java入门:Java环境变量PATH、CLASSPATH、JAVA_HOME

    一些初学者在用java HelloWorld指令运行程序的时候出现: Exception in thread "main" java.lang.NoClassDefFoundErr ...

  3. [转]JAVA环境变量JAVA_HOME、CLASSPATH、PATH设置详解

    [转] JAVA环境变量JAVA_HOME.CLASSPATH.PATH设置详解 - dreamman的日志 - 网易博客http://blog.163.com/dreamman_yx/blog/st ...

  4. JAVA环境变量JAVA_HOME、CLASSPATH、PATH设置详解

    Windows下JAVA用到的环境变量主要有3个,JAVA_HOME.CLASSPATH.PATH.下面逐个分析. JAVA_HOME 指向的是JDK的安装路径,如C:\jdk1.5.0_06,在这路 ...

  5. Java中环境变量PATH与CLASSPATH的区别

    在安装JDK时需要添加环境变量,经常使用的环境变量有两个: PATH与CLASSPATH 下面总结一下环境变量的作用. PATH是系统用来指定可执行文件的完整路径.当在CMD中执行命令时,如果执行的可 ...

  6. WINDOWS系统下环境变量PATH和CLASSPATH的意思

    1 PATH 对于没有包含路径的命令,WINDOWS系统会默认去Windows 目录(C:\windows)和系统目录(C:\windows\system32)查找,如果没有找到,就去PATH变量内包 ...

  7. Java 环境变量设置 -- JAVA_HOME CLASSPATH

    1.打开我的电脑--属性--高级--环境变量 2.新建系统变量JAVA_HOME 和CLASSPATH 变量名:JAVA_HOME 变量值:C:\Program Files\Java\jdk1.7.0 ...

  8. Windows 下java环境变量的配置(Windows7 ,8,8.1,10)

    Windows 下java环境变量的配置 在“系统”面板的左上角选择“高级系统设置”,在弹出的系统属性中选择”高级“项,然后点击右下角的“环境变量(N)...”,就此进入JAVA环境变量的配置. 如果 ...

  9. JAVA环境变量配置详解

    JAVA环境变量JAVA_HOME.CLASSPATH.PATH设置详解 Windows下JAVA用到的环境变量主要有3个,JAVA_HOME.CLASSPATH.PATH. JAVA_HOME 指向 ...

随机推荐

  1. python selenium-webdriver 登录验证码的处理(十二)

    很多系统为了防止坏人,会增加各样形式的验证码,做测试最头痛的莫过于验证码的处理,验证码的处理一般分为三种方法 1.开发给我们设置一个万能的验证码: 2.开发将验证码给屏蔽掉: 3.自己识别图片的上的千 ...

  2. USD在CentOS7.0操作系统下的安装方法

    最近Pixar的开源USD软件很火,官方在Introduce中明确讲到这个软件的设计开发目标是增强艺术家协作,减少不确定因素,最大化资产版本迭代效率,追求更大的承载能力. 当今行业中传统的线性的制作方 ...

  3. 使用SQL SERVER 来自动发送邮件

    可以使用SQL SERVER 来发送自动邮件,主要是使用SQL SERVER 的dbo.sp_send_dbmail 存储过程(在msdb数据库中). 具体步骤如下: Step1: 编写要发送的邮件内 ...

  4. [UE4]瞬移对象

    一.首先把Predict Projectile Path By TraceChannel的Draw Debug Type改成none,不显示射线,改成该选项并不会影响正常使用. 二.避免瞬移穿透底板 ...

  5. symfony 踩坑之旅 视频实操从第九章开始

    1.annotation定义路由 @Route("/**",defaults={"name":"world"},requirements={ ...

  6. socket通信中select函数的使用和解释

    select函数的作用: select()在SOCKET编程中还是比较重要的,可是对于初学SOCKET的人来说都不太爱用select()写程序,他们只是习惯写诸如 conncet().accept() ...

  7. Python中多个列表与字典的合并方法

    Python中多个列表与字典的合并方法 1多列表的合并 1)a+=b a=['] b = ['] a += b print(a) >>>['] 2) a.extend(b) a=[' ...

  8. AD服务无法启动

    转自网络资源:http://www.great-one.co.uk/archives/289 版本:win08 : 该方法支持hyper-v 虚拟机 启动报错: A Windows 2008 R2 D ...

  9. Kafka安装及开启SASL_PLAINTEXT认证(用户名和密码认证)

    前些日子要封装一个kafka的客户端驱动,配置了下kafka环境,发现配置复杂度完爆rabbitmq很多倍啊,而且发布订阅模式使用起来也很麻烦,可能就胜在分布式了吧. kafka需要java环境,自行 ...

  10. 洛谷题解 CF807A 【Is it rated?】

    同步题解 题目 好吧,来说说思路: 1.先读入啦~(≧▽≦)/~啦啦啦 2.判断a[i]赛前赛后是否同分数,如果分数不同,则输出,return 0 . 3.如果同分数,则判断a[i]赛前(或赛后)是否 ...