Java环境变量PATH和CLASSPATH

Java环境变量PATH和CLASSPATHJava开发中常用到环境变量的配置,下面简单介绍下Java中经常配置的环境变量:PATH和CLASSPATH。1、PATH环境变量1.1作用简介安装完JDK(JavaDevelopmentKit,Java开发套件)之后,可以在安装目录下找到两个子目录(bin目录和lib目录)。bin目录中包含着Java编译器等可执行文件。如果要运行执行java命令,必须得执行java命令对应的可执行文件的路径

大家好,又见面了,我是你们的朋友全栈君。

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工具相对性的,如下图:

tools_jar

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://javaforall.net/151939.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 深入理解okio的优化思想

    深入理解okio的优化思想随着越来越多的应用使用OKHttp来进行网络访问,我们有必要去深入研究OKHTTP的基石,一套更加轻巧方便高效的IO库okio.OKIO的优点有同学或会问,目前Java的IO已经非常成熟了,为什么还要使用新的IO库呢?笔者认为,答案有以下几点:低的CPU和内存消耗。后面我们会分析到,okio采用了segment的机制进行内存共享和复用,尽可能少的去申请内存,同时也就降低了GC的频率。我们知道,过于

    2022年6月8日
    35
  • c语言中system函数怎么用_system函数的返回值

    c语言中system函数怎么用_system函数的返回值C语言中如何使用system函数一.system函数c语言中的system()函数主要用于发出一个DOS命令,该函数已经收录在标准c库中,可以直接调用。使用时包含头文件<stdlib.h>补充:DOS:DOS是DiskOperatingSystem的缩写,即磁盘操作系统。它是一个基于磁盘管理的操作系统。DOS命令:是指DOS操作系统的命令,是一种面向磁盘的操作命令,主要包括目录操作类命令、磁盘操作类命令、文件操作类命令和其它命令。(学习DOS命令是控制微机的基础)提供用户使用的

    2025年11月21日
    2
  • maven install 出现 not found: G:\jdk\..\lib\tools.jar -> [Help 1] 等问题「建议收藏」

    maven install 出现 not found: G:\jdk\..\lib\tools.jar -> [Help 1] 等问题「建议收藏」maven install 出现 not found: G:\jdk\..\lib\tools.jar -> [Help 1] 等问题

    2022年4月23日
    35
  • latex的参考文献写法标准_参考文献举例

    latex的参考文献写法标准_参考文献举例使用Latex撰写论文时,通常会遇到参考文献格式问题,下面我将与大家分享Latex参考文献规范写作。 1、建议使用bib文件编写Reference这样可以减少格式、空格和标点符号的错误。 Bibtex使用方法简介:新建一个空白文本文档,把后缀名改成bib即可,比如TIP.bib; 用TexWorks打开文件,加入你想要引用的文章,有一个简便的添加的方式是使用百度/谷歌…

    2025年9月3日
    21
  • FileSystemWatcher 用法

    FileSystemWatcher 用法1.FileSystemWatcher基础在应用FileSystemWatcher对象之前,必须了解这个对象的一些基本属性和事件。毫无疑问,这个对象的最重要的属性为“EnableRaisingEvents”属性。这个属性决定对象在收到改变通知时是否提交事件。如果EnableRaisingEvents属性设为假,对象将不会提交改变事件。如果设为真,它将提交改变事件。下面是在应用FileSys

    2022年6月17日
    20
  • 广东汕尾电信稳定dns服务器,广东电信的DNS是多少?

    广东汕尾电信稳定dns服务器,广东电信的DNS是多少?广东省广州市(中国电信)首选DNS:202.96.128.86备份DNS:202.96.128.166广东省汕尾市(中国电信)首选DNS:202.96.128.166备份DNS:202.96.128.86广东省汕头市(中国电信)备份DNS:202.96.128.166广东省河源市(中国电信)首选DNS:202.96.128.166备份DNS:202.96.128.86广东省深圳市(中国电…

    2022年7月11日
    46

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号