Java平台,标准版工具参考 ---- 2 Class Path配置

本文深入解析Java中的ClassPath概念,包括其配置方法、环境变量设置、通配符使用及与包名的关系等内容,帮助读者更好地理解和掌握Java类加载机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2 Class Path配置

classpath是JRE搜索class和其他资源文件时的路径. 本章讨论如下主题:

概要

类搜索路径 (classpath) 可经由 JDK 工具的 -classpath 选项在调用时设置 (优选的方法) 或者,通过 CLASSPATH 环境变量设置. -classpath 选项之所以是优选方案, 是因为你可以为每个应用独立设置而不会影响其他的程序且不会修改其他程序的值.

sdkTool -classpath classpath1:classpath2...  
set CLASSPATH=classpath1;classpath2...
  • sdkTool
    一个命令行工具, 比如 java, javac, javadoc 或者 apt. 查阅列表:JDK Tools and Utilities
  • classpath1:classpath2
    指向 jar, zip 或者 class 文件的 classpath (类搜索路径). 每个 classpath 应当以文件名或者目录结尾. 取决于你要设置哪种情况, 如下:
    • 对于包含类文件的 jar 或 zip , classpath 以 zip 或 jar 的文件名结尾.
    • 对于不含包名的类文件, classpath 以包含这些文件的目录名结尾.
    • 对于含有包名的类文件, classpath 以包含包根目录, 也就是包全名中的第一个包名, 的目录名结尾.

多个路径条目以分号分隔, 在 Windows 中的等号 (=) 和 Oracle Solaris 中的冒号之间没有空格.
默认的 classpath 是当前目录. 设置 CLASSPATH 变量或使用 -classpath 命令行选项将覆盖默认值. 所以, 如果你想要在类搜索路径中包含当前目录, 那么在你的新设置值中必须包含一个点号 (.).
classpath 的路径条目如果既不是目录又不是归档文件 ( zip 或 jar 文件) 也不是星号 (*) 通配符就将被忽略.

描述

classpath 告诉 JDK 工具和应用程序到哪里取搜寻不属于 Java 平台及其扩展的, 第三方和用户定义的 class文件. 参考扩展机制
classpath 需要找到你使用 javac 编译的任何类. 默认是当前目录以便找到它们.
JDK, JVM 和 JDK 工具按照 Java平台 (引导) 类, 扩展类和 classpath 的顺序来查找类. 关于搜寻策略的详细信息,请参考:类是如何被发现的
大多数应用程序的类库使用扩展机制. 仅当你想要加载的类 (a) 不在当前目录或当前目录的任何子目录中; 并且 (b) 不在扩展机制指定的位置 时才需要设置 classpath.
如果你从较早版本的 JDK 升级, 那么你的启动设置中可能含有不再被需要的 CLASSPATH 设置. 你需要移除任何非应用程序专用的设置, 如 classes.zip. 一些第三方的使用 JVM 的应用程序会修改你的 CLASSPATH 环境变量以便引入它们所使用的类库. 那些设置可以被保留.
你可以在调用 JVM 或其他 JDK 工具时通过一些 java 命令的 -classpath-cp 选项, 或通过 CLASSPATH 环境变量, 来修改 classpath. 参考: JDK Commands Class Path Options.使用 -classpath 选项优于设置 CLASSPATH 环境变量, 因为你可以为每个应用程序单独设置它, 而不会影响其他应用程序, 而无需其他应用程序修改其值. 参考:CLASSPATH Environment Variable.
类可以存储于目录 (文件夹) 或者归档文件中. java平台的类被存储于 rt.jar中. 关于归档文件和 classpath 工作的更多信息可以参考:Class Path and Package Names.
NOTE: 一些早起 JDK 在默认的 classpath 中有一个 <jdk-dir>/classes 条目. 该目录的存在供 JDK 使用而不应该被应用程序类使用. 应用程序类应当被放置在 JDK 目录层次结构之外. 这样一来, 安装一个新的 JDK 不会强迫你重新安装应用程序的类. 为了兼容早期版本 (的JDK), 使用 <jdk-dir>/classes 目录作为类库的应用程序在当前版本(1.7)能够运行, 但不保证将在以后的版本中运行.

JDK命令classpath选项

以下的命令有 -classpath 选项, 能够在运行时替换由 CLASSPATH 环境变量指定的路径: java, jdb, javac, javah 和 jdeps.
-classpath 选项是被推荐用来改变类搜索路径的. 因为每个应用程序都能有一个它所需的 classpath 而不会干扰到任何其他的程序. 命令 java 还有一个 -cp 选项表示 -classpath 的缩写.
对于非常特殊的情况, java 和 javac 命令都含有一个能让你更改他们自用类库路径的选项. 但绝大多数用户从来不会需要用到.

CLASSPATH 环境变量

正如 JDK Commands Class Path Options 中所述, -classpath 命令行选项优于 CLASSPATH 环境变量. 但是, 如果您决定使用 CLASSPATH 环境变量, 本节将介绍如何设置和清除它.

懒得翻译了..... 略过

classpath通配符

classpath 条目可以包含基本名称通配符 (*), 这相当于指定了一个目录下所有的扩展名为 .jar 或 .JAR 的文件的列表. 举例来说, classpath 条目 mydir/* 指定了名为 mydir 的目录中所有的 jar 文件. 由*组成的 classpath 条目扩展为当前目录中所有jar文件的列表, 无论他们是否被隐藏 (文件名以 '.' 开头).
含有星号 (*) 的 classpath 并不匹配 class 文件. 要同时匹配在单一文件夹 mydir 中的 class 和 jar 文件, 用 mydir:mydir/* 或者 mydir/*:mydir . 所选择的顺序决定了类和资源文件是否在 jar 文件之前加载, 反之亦然.
子文件夹不会被递归查找. 比如, mydir/* 只查找 mydir 目录中的 jar 文件, 而不会查找 mydir/subdir1, mydir/subdir2 等目录.
在展开 classpath 目录时, jar 文件的枚举顺序是不定的, 并且可能在平台之间甚至在同一台机器上随时变化. 一个结构良好的应用程序不应该依赖任何特定的顺序. 如果特定顺序是必须的, 那么 jar 文件需要在 classpath 中被明确的枚举出来.
展开通配符时提前完成的 ---- 在调用程序的 main 方法之前, 而不是之后 ---- 在类加载进程中. 每个输入到 classpath 含有通配符的条目都将被经由枚举目录中的 jar 文件产生的元素序列 (可能为空) 所替换. 比如说, 如果目录 mydir 含有 a.jar, b.jar 和 c.jar, 那么 mydir/* 将被展开为 mydir/a.jar:mydir/b.jar:mydir/c.jar, 并且该字符串将是系统属性 java.class.path 的值.
CLASSPATH 环境变量的处理方式与 -classpath-cp 选项没有什么不同. 在所有的这些情况下通配符都会生效. 但是, 在 jar 文件的 MANIFEST.MF 中的 Class-Path 头中不会生效.

classpath和包名

java 的类通过包来组织, 它们被映射成文件系统的目录. 但是, 不像文件系统, 不论何时你指定一个包名, 你需要指定完整的包名而不是它的一部分. 比如, 类 java.awt.Button 的包名始终指定为 java.awt.
假设你想让 jre 寻找一个位于 utility.myapp 包中的名叫 Cool.class 的类. 如果目录的路径为 /java/MyClasses/utility/myapp, 那么你将设置 classpath 以便其包含 /java/MyClasses. 要运行此程序, 你可以使用以下 java 命令:

java -classpath /java/MyClasses utility.myapp.Cool  

当程序开始运行, jvm 使用 classpath 设置来查找由 Cool 类使用的 utility.myapp 包中定义的任何其他类.
整个包名都被指定在命令中. 否则会找不到类, 比如, 将 classpath 设置为 /java/MyClasses/utility 或使用 java myapp.Cool 命令来运行程序.
你或许想要为某个类指定一个包名. 但事实上包名是类的一部分而且不可被修改. 除非重新编译这个类.
包规范机制的一个有趣的后果是同一个包中的各个类可以存在于不同的文件夹中. 对于每个类来说它们都有同一的包名, 然而 classpath 中对于每个类文件的路径可能从不同的目录开头.

文件夹和归档文件

当类存放于目录 (文件夹) 中时, 例如 /java/MyClasses/utility/myapp, 那么 classpath 条目指向包含包名称的第一个元素的目录 (本例中是 /java/MyClasses, 应为包名为 utility.myapp).
当类存放于归档文件 (zip 或 jar 文件) 时, classpath 条目是包含 zip 或 jar 文件的路径. 例如, 使用 jar 文件中的类库的命令:

java -classpath /java/MyClasses/myclasses.jar utility.myapp.Cool

多重指定

为了找到位于目录 /java/MyClasses/java/OtherClasses 中的类, 你需要设置如下 classpath. 注意,两个路径用冒号分割.

java -classpath /java/MyClasses:/java/OtherClasses ...

指定顺序

你指定的多个 classpath 条目的顺序很重要. Java 解释器将按照它们在 classpath 变量中出现的顺序查找目录中的类. 前例中, Java 解释器将首先查找 /java/MyClasses 中所需的类. 只有在该目录中找不到具有正确名称的类时, 解释器才会查找 /java/OtherClasses 目录.

转载于:https://my.oschina.net/CasparLi/blog/1476994

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值