# 管理源文件和类文件

Java 平台的许多实现都依赖分层文件系统来管理源文件和类文件,尽管 「Java 语言规范并」不要求这样做。战略如下。

将类、接口、枚举或注释类型的源代码放在一个文本文件中,该文件的名称是类型的简单名称,其扩展名是 .java。例如:

//in the Rectangle.java file
package graphics;
public class Rectangle {
   ...
}
1
2
3
4
5

然后,将源文件放在名称反映类型所属包的名称的目录中:

.....\graphics\Rectangle.java
1

假定 Microsoft Windows 文件名分隔符反斜杠(对于 UNIX,使用正斜杠),包成员的限定名称和文件的路径名是并行的。

class name – graphics.Rectangle
pathname to file – graphics\Rectangle.java
1
2

正如您应该记得的,按照惯例,一家公司使用其反向因特网域名作为其包名。示例公司的互联网域名 example.com 将在其所有包名称之前 com.example。 包名称的每个组件都对应一个子目录。所以,如果公司有一个 com.example.graphics 包含 Rectangle.java 源文件的包, 它将包含在一系列子目录中,如下所示:

....\com\example\graphics\Rectangle.java
1

编译源文件时,编译器会为其中定义的每种类型创建一个不同的输出文件。输出文件的基本名称是类型的名称,其扩展名是 .class。例如,如果源文件是这样的

//in the Rectangle.java file
package com.example.graphics;
public class Rectangle {
      . . .
}

class Helper{
      . . .
}
1
2
3
4
5
6
7
8
9

那么编译的文件将位于:

父目录 \com\example\graphics\Rectangle.class
父目录 \com\example\graphics\Helper.class
1
2

像 .java 源文件一样,编译的 .class 文件应该在一系列反映包名称的目录中。 但是,.class 文件的路径不必与 .java 源文件的路径相同。您可以分别安排源和目录目录,如下所示:

<path_one>\sources\com\example\graphics\Rectangle.java

<path_two>\classes\com\example\graphics\Rectangle.class
1
2
3

通过这样做,您可以将 classes 目录提供给其他程序员,而不会泄露您的源代码。 您还需要以这种方式管理源文件和类文件,以便编译器和 Java 虚拟机(JVM)可以找到您的程序使用的所有类型。

classes 目录的完整路径 <path_two>\classes,称为类路径,并用 CLASSPATH 系统变量设置。 编译器和 JVM .class 通过将包名称添加到类路径来构建文件的路径。例如,如果

<path_two>\classes
1

是你的类路径,包名是

com.example.graphics,
1

那么编译器和 JVM 寻找 files 中的 .class

<path_two>\classes\com\example\graphics.
1

类路径可能包含多个路径,用分号(Windows)或冒号(UNIX)分隔。默认情况下,编译器和 JVM 搜索当前目录以及包含 Java 平台类的 JAR 文件, 以便这些目录自动位于类路径中。

# 设置 CLASSPATH 系统变量

要显示当前 CLASSPATH 变量,请在 Windows 和 UNIX(Bourne shell)中使用这些命令:

In Windows:   C:\> set CLASSPATH
In UNIX:      % echo $CLASSPATH
1
2

要删除 CLASSPATH 变量的当前内容,请使用以下命令:

In Windows:   C:\> set CLASSPATH=
In UNIX:      % unset CLASSPATH; export CLASSPATH
1
2

要设置 CLASSPATH 变量,请使用这些命令(例如):

In Windows:   C:\> set CLASSPATH=C:\users\george\java\classes
In UNIX:      % CLASSPATH=/home/george/java/classes; export CLASSPATH
1
2