专业的JAVA编程教程与资源

网站首页 > java教程 正文

java 核心技术-12版 卷Ⅰ- 4.8.6 类路径

temp10 2024-09-10 21:10:55 java教程 8 ℃ 0 评论

原文

4.8.6

在前面已经看到,类存储在文件系统的子目录中。类的路径必须与包名匹配。

另外,类文件也可以存储在jar (Java归档)文件中。在一个jar 文件中,可以包含多个压缩格式的类文件和子目录,这样既可以节省空间又可以改善性能。在程序中用到第三方的库时,你通常会得到一个或多个需要包含的jar 文件。第11章将介绍如何创建你自己的 jar 文件。

java 核心技术-12版 卷Ⅰ- 4.8.6 类路径

提示:jar 文件使用zip 格式组织文件和子目录。可以使用任何zip工具查看jar 文件

为了使类能够被多个程序共享,需要做到以下几点:

  1. 把类文件放到一个目录中,例如 /home/user/classdir。需要注意,这个目录是包树状结构的基目录。如果希望增加 com.horstmann.corejava.Employee类,那么Employee.class 类文件就必须位于子目录 /home/user/classdir/com/horstmann.corejava 中。
  2. 将jar 文件放在一个目录中,例如 /home/user/archives。
  3. 设置类路径(class path)。类路径是所有包含类文件的路径的集合
  4. 在UNIX环境中,类路径的各项之间用冒号(英文冒号 : )分隔,如:

/home/user/classdir:.:/home/user/archives/archive.jar

而在windows ,则以分号(英文分号 ; )分隔,如:

c:\classdir;.;c:\archives\archive.jar

不论在unix 还是在 windows ,都用句号(英文 .)表示当前目录

类路径包括:

  • 基目录 /home/user/classdir 或 c:\classdir ;
  • 当前目录(.)
  • jar 文件 /home/user/archives/archive.jar 或 c:\archives\archive.jar

从Java 6 开始,可以为jar 文件目录指定一个通配符,如下

/home/user/classdir:.:/home/user/archives/'*'

c:\classdir;.;c:\archives\*

在 unix 中,* 必须转义以防止 shell 扩展。

archives 目录中的所有jar 文件(但不包括.class 文件)都包含在这个类路径中。

由于总是会搜索Java api 的类,所以不必显示地包含在类路径中。

警告:javac 编译器总是在当前目录中查找文件,但只有当类路径中包含“.” 目录时,Java虚拟机才会查看当前目录。如果你没有设置类路径,那么没有什么问题,因为默认的类路径会包含 "."目录。但是如果你设置了类路径却忘记包含 “.” 目录,那么尽管你的程序可以没有错误地通过编译,却不能运行。

类路径所列出的目录和归档文件是搜索类的起始点。下面看一个类路径示例:

/home/user/classdir:.:/home/user/archives/archive.jar

假定虚拟机要搜索 com.horstmann.corejava.Employee 类的类文件。它首先要查看Java api 类。现在,在那里找不到相应的类文件,所以转而查看类路径。它会查找以下文件:

  • /home/user/classdir/com/horstmann/corejava/Employee.class
  • com/horstmann/corejava/Employee.class (从当前目录开始)
  • com/horstmann/corejava/Employee.class(/home/user/archives/archive.jar中)

编译器查找文件要比虚拟机复杂得多。如果引用了一个类,而没有指定这个类的包,那么编译器将首先查找包含这个类的包。它会查看所有的import 指令,确定其中是否包含这个类。例如,假定源文件包含指令:

import java.util.*;

import com.horstmann.corejava.*;

并且源代码引用了Employee 类。编译器将尝试查找 java.lang.Employee(因为总是会默认导入java.lang包)、java.util.Employee、com.horstmann.corejava.Employee 和当前包中的Employee。它会在类路径所有位置中搜索以上各个类。如果找到了一个以上的类,就会产生编译时错误(因为完全限定类名必须是唯一的,所以import 语句的次序并不重要)。

编译器的任务不止这些,他还要查看源文件是否比类文件新。如果是这样的话,那么源文件就会自动地重新编译。在前面已经知道,只可以导入其他包中的公共类。一个源文件只能包含一个公共类,并且文件名与公共类名必须匹配。因此,编译器很容易找到公共类的源文件。不过,还可以从当前包中导入非公共类。这些类有可能在与类名不同的源文件中定义。如果从当前包中导入一个类,那么编译器就要搜索当前包中的所有源文件,查看哪个源文件定义了这个类。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表