Java编程:包、类搜索、JAR工具与系统属性详解
立即解锁
发布时间: 2025-08-17 02:35:30 阅读量: 17 订阅数: 22 


Java编程基础与SCJP认证指南
### Java编程:包、类搜索、JAR工具与系统属性详解
#### 1. 包的编译
在Java编程中,包是组织代码的重要方式,它可以映射到分层文件系统。例如,包名 `wizard.pandorasBox` 对应文件系统中的路径名 `wizard/pandorasBox`。
当我们编译Java代码时,可以使用 `javac` 命令的 `-d` 选项指定包目录的创建位置。以下是具体的操作步骤:
1. **指定当前目录为目标目录**:假设当前目录为 `/pgjc/work`,且有四个源文件 `Clown.java`、`LovePotion.java`、`Ailment.java` 和 `Baldness.java`。在当前目录下执行以下命令:
```bash
javac -d . Clown.java LovePotion.java Ailment.java Baldness.java
```
此命令会在当前目录下创建一个文件层次结构,该结构与包层次结构相对应。
2. **指定绝对路径为目标目录**:也可以指定绝对路径作为目标目录,例如:
```bash
javac -d /pgjc/work Clown.java LovePotion.java Ailment.java Baldness.java
```
3. **指定相对路径为目标目录**:还可以使用相对路径,如在 `/pgjc/work` 目录下执行:
```bash
javac -d ../myapp Clown.java LovePotion.java Ailment.java Baldness.java
```
这将在 `/pgjc/myapp` 目录下创建必要的包和类文件。
如果不使用 `-d` 选项,`javac` 编译器的默认行为是将所有类文件直接放在当前目录下,而不是放在与包对应的子目录中。同时,如果 `-d` 选项指定的目标目录存在问题(如不存在或没有正确的文件权限),编译器会报告错误。
以下是一个文件层次结构的示例:
```plaintext
work
├── wizard
│ └── pandorasBox
│ ├── Magic.class
│ ├── Clown.class
│ └── LovePotion.class
├── spells
│ ├── Baldness.class
│ └── LovePotion.class
└── artifacts
└── Ailment.class
```
#### 2. 类的搜索
在运行Java程序时,需要指定类的全限定名。例如,当前目录的绝对路径为 `/pgjc/work`,要运行 `./wizard/pandorasBox` 目录下的 `Clown.class`,需要在 `java` 命令中指定全限定名:
```bash
java wizard.pandorasBox.Clown
```
这将从 `./wizard/pandorasBox/Clown.class` 文件中的字节码加载 `Clown` 类,并启动其 `main()` 方法。
为了让JDK工具能够找到类和其他资源文件,可以使用 `CLASSPATH` 环境变量或 `-classpath` 选项(通常缩写为 `-cp`)来指定类搜索路径。不过,`CLASSPATH` 环境变量会影响主机平台上的所有Java应用程序,且任何应用程序都可以修改它,因此不推荐使用。而 `-cp` 选项可以为每个应用程序单独设置类路径,避免应用程序之间相互影响。
以下是一些类搜索的示例:
1. **默认类路径**:当没有定义类路径时,默认的类路径是当前目录。例如,在 `/top/src` 目录下编译 `A.java` 文件时,如果没有指定类路径,编译器会在当前目录下查找所需的类:
```bash
javac -d ../bin A.java
```
如果 `A.java` 中使用了 `B` 类,而 `B.class` 文件在 `/top/bin/pkg` 目录下,编译器会找不到 `B` 类,因为默认类路径是当前目录。
2. **指定类路径**:可以使用 `-cp` 选项指定类路径,例如:
```bash
javac -cp /top/bin -d ../bin A.java
```
这将设置类路径为 `/top/bin`,编译器会在该目录下查找所需的类。
需要注意的是,当指定类路径时,应该指定包的位置,即类路径指示包含全限定包名第一个元素的目录。例如,对于包 `pkg` 位于 `/top/bin` 目录下,使用 `-cp /top/bin` 可以找到该包中的类,但使用 `-cp /top/bin/pkg` 则无法找到。
类路径可以指定多个条目,JDK工具会按照从左到右的顺序搜索这些条目。例如:
```bash
-cp /pgjc/work:/top/bin/pkg:.
```
这里使用了Unix平台的路径分隔符 `:` 来分隔条目,并将当前目录 `.` 作为一个条目包含在内。搜索类路径条目时,一旦找到所需的类文件,搜索就会停止,因此条目的指定顺序可能很重要。
以下是一个类搜索的流程图:
```mermaid
graph TD;
A[开始] --> B[JDK工具查找标准库];
B --> C{类是否在标准库中};
C -- 是 --> D[使用标准库中的类];
C -- 否 --> E{是否定义类路径};
E -- 否 --> F[使用默认类路径(当前目录)];
E -- 是 --> G[按类路径顺序搜索];
G --> H{是否找到类文件};
H -- 是 --> I[使用找到的类文件];
H -- 否 --> J[报错];
D --> K[结束];
F --> K;
I --> K;
J --> K;
```
#### 3. JAR工具的使用
JAR(Java ARchive)工具提供了一种方便的方式来打包和部署Java程序。一个典型的JAR文件包含应用程序所需的类文件和其他资源(如图像和音频文件),还会创建并包含一个特殊的清单文件,该文件可以包含有关应用程序的重要信息,如哪个类包含启动应用程序的 `main()` 方法。
以下是创建JAR文件的步骤:
1. **创建JAR文件**:使用 `jar` 命令创建JAR文件,例如:
```bash
jar cmf whereismain.txt bundledApp.jar wizard
```
其中,`c` 选项告诉 `jar` 工具创建一个存档,`m` 选项用于创建并包含一个清单文件,清单文件的信息来自命令行指定的文本文件 `whereismain.txt`,`f` 选项指定要创建的存档名称 `bundledApp.jar`。命令行中 `wizard` 目录下的内容将被存档。
2. **清单文件的设置**:清单文件中的信息以名值对的形式指定。例如,在 `whereismain.txt` 文件中指定程序的执行入口点:
```plaintext
Main-Class: wizard.pandorasBox.Clown
```
最后一行必须以换行符结尾,以便 `jar` 工具能够正确处理。
3. **运行JAR文件**:可以使用以下命令运行JAR文件中的应用程序:
```bash
java -jar bundledApp.jar
```
还可以在JAR文件名后指定程序参数。
JAR文件的另一个常见用途是将包打包成库,供其他Java程序使用。可以将JAR文件放在 `jre/lib/ext` 目录下,或者在 `CLASSPATH` 环境变量中指定其路径,也可以使用 `-cp` 选项指定JAR文件的路径。
以下是一个使用JAR文件的示例:假设 `MyApp` 类使用了 `org.graphics.draw4d.Menu` 类和 `gui.jar` 文件中的类,在 `/top/src` 目录下编译 `MyApp.java` 文件的命令如下:
```bash
javac -cp /top/lib/gui.jar:/top/lib -d /top/bin MyApp.java
```
还可以使用类路径通配符 `*` 来包含目录中的所有JAR文件,例如:
```bash
javac -cp /top/lib/*:/top/lib -d /top/bin MyApp.java
```
需要注意的是,通配符 `*` 只扩展到类路径条目指定目录下的JAR文件,不会扩展到类文件,也不会递归扩展到子目录中的JAR文件。
#### 4. 系统属性的使用
Java运行时环境
0
0
复制全文
相关推荐









