关于CLASSPATH的一点感想

Posted 小马识图

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于CLASSPATH的一点感想相关的知识,希望对你有一定的参考价值。

前面的例子只涉及到一个HelloJava.java文件,所以也没有牵涉到classpath。但是实际的编程中不可能有这么简单的程序,因此也常常需要关注classpath的设定。

oracle 官方文档对于classpath的定义是:

The class path is the path that the Java runtime environment searches for classes and other resource files. The class search path (more commonly known by the shorter name, “class path”) can be set using either the -classpath option when calling a JDK tool (the preferred method) or by setting the CLASSPATH environment variable.

这里有几个问题:

  1. 搜索什么?
    第三方或用户定义的.class,这里的路径就是告诉JDK命令如何去搜索到这些.class. 文档进一步给出解释: paths to the .jar, .zip or .class files , 并且详细指定了在各种情况下classpath具体的设置:
    1.1. .jar和.zip文件: 这时候path必须是.jar,.zip文件本身。
    1.2. .class文件(位于未命名的package): 包含.class文件的目录
    1.3. .class文件(位于命名的package): 包含package根节点的目录(请看下面的示例)
  2. 哪些命令会用到classpath
    java, javac, javadoc, jdb,javah
  3. 命令行选项与CLASSPATH环境变量的关系
    3.1. 命令行选项覆盖CLASSPATH环境变量
    3.2. 默认classpath为当前目录,注意设置-classpath或者CLASSPATH不会默认添加当前目录。

CLASSPATH和package

上面提到, 当需要搜索的.class位于命名的package时,指定classpath包含package根节点的目录。怎么理解?一个例子可能比抽象的解释更明了。

假设有一个类NavigationController位于package com.nvidia.navigation:

package com.nvidia.navigation;
......
public class NavigationController

  public static void main( String[] args )  
......

假设我们需要运行NavigationController该如何指定classpath?

java -classpath ??? com.nvidia.navigation.NavigationController

假设我们的NavigationController.class路径是C:\\java\\MyProject\\bin\\com\\nvidia\\navigation\\NavigationController.class,
其中package名是com.nvidia.navigation,什么是package根节点? 显然是com,那么com的目录在哪里,是C:\\java\\MyProject\\bin,那么我们就知道怎么设置这个classpath了:

java -classpath C:\\java\\MyProject\\bin com.nvidia.navigation.NavigationController

有一点需要注意的就是package的名称必须是全称,不能像路径名一样分开,因此classpath只能指向package根节点的目录,而不能继续往下延伸!


classpath or cp

所有需要classpath的命令都能够识别-classpath 选项, 但不知道为什么java命令除了支持-classpath,还能够识别缩写-cp:

java -cp PATH1;PATH2 …


路径顺序

指定路径的次序具有重要影响。 Java虚拟机会按照CLASSPATH设置的次序从前往后开始搜索,只有在前面的路径搜索失败的时候才会继续向后面的路径搜索。

以上是关于关于CLASSPATH的一点感想的主要内容,如果未能解决你的问题,请参考以下文章

关于逆向360相关的一点感想

关于最近996.icu的一点感想

关于热力图的loss的一点感想

关于读《构建之法》的一点微小的感想

Bitcoin 垮掉后的一点感想

学python的一点感想