关于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设置的次序从前往后开始搜索,只有在前面的路径搜索失败的时候才会继续向后面的路径搜索。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值