发信人: SuperMMX (笑天子), 信区: Java
标 题: [整理] Java 的 Class Path 和 Package
发信站: BBS 水木清华站 (Mon Apr 9 08:15:01 2001)
Java 中的 ClassPath 和 Package
前言:
由于这两个问题新手问得较多, 且回答比较零散, 很难统一整理, 所
以就直接写了一篇, 还请大家见谅.
由于这两个问题新手问得较多, 且回答比较零散, 很难统一整理, 所
以就直接写了一篇, 还请大家见谅.
正文:
一, 类路径 (class path)
当你满怀着希望安装好了 java, 然后兴冲冲地写了个 hello world,然后编译,
运行, 就等着那两个美好的单词出现在眼前, 可是不幸的是, 只看到了 Can't find
class HelloWorld 或者 Exception in thread "main" java.lang.NoSuchMethodError: main.
为什么呢? 编译好的 class 明明在呀.
我们一起来看一看 java 程序的运行过程. 我们已经知道 java 是通过 java
虚拟机来解释运行的, 也就是通过 java 命令, javac 编译生成的 .class
文件就是虚拟机要执行的代码, 称之为字节码(bytecode), 虚拟机通过 classloader
来装载这些字节码, 也就是通常意义上的类. 这里就有一个问题, classloader 从
哪里知道 java 本身的类库及用户自己的类在什么地方呢? 或者有着缺省值(当前路径).
或者要有一个用户指定的变量来表明, 这个变量就是类路径(classpath), 或者在运行
的时候传参数给虚拟机. 这也就是指明 classpath 的三个方法. 编译的过程和运行
的过程大同小异, 只是一个是找出来编译, 另一个是找出来装载.
实际上 java 虚拟机是由 java luncher 初始化的, 也就是 java (或 java.exe)
这个程序来做的. 虚拟机按以下顺序搜索并装载所有需要的类:
1, 引导类: 组成 java 平台的类, 包含 rt.jar 和 i18n.jar 中的类.
2, 扩展类: 使用 java 扩展机制的类, 都是位于扩展目录($JAVA_HOME/jre/lib/ext)
中的 .jar 档案包.
3, 用户类: 开发者定义的类或者没有使用 java 扩展机制的第三方产品. 你必须在
命令行中使用 -classpath 选项或者使用 CLASSPATH 环境变量来确定这些类的位置. 我
们在上面所说的用户自己的类就是特指这些类.
这样, 一般来说, 用户只需指定用户类的位置, 引导类和扩展类是"自动"寻找的.
那么到底该怎么做呢? 用户类路径就是一些包含类文件的目录, .jar, .zip 文件的
列表, 至于类具体怎么找, 因为牵扯到 package 的问题, 下面将会说到, 暂时可认为
只要包含了这个类就算找到了这个类. 根据平台的不同分隔符略有不同, 类 unix 的系
统基本上都是 ":", windows 多是 ";". 其可能的来源是:
* ".", 即当前目录, 这个是缺省值.
* CLASSPATH 环境变量, 一旦设置, 将缺省值覆盖.
* 命令行参数 -cp 或者 -classpath, 一旦指定, 将上两者覆盖.
* 由 -jar 参数指定的 .jar 档案包, 就把所有其他的值覆盖, 所有的类都来自这个指
定的档案包中. 由于生成可执行的 .jar 文件, 还需要其他一些知识, 比如 package,
还有特定的配置文件, 本文的最后会提到. 可先看看 jdk 自带的一些例子.
我们举个 HelloWorld 的例子来说明. 先做以下假设:
* 当前目录是 /HelloWorld (或 c:/HelloWorld, 以后都使用前一个)
* jdk 版本为 1.2.2 (linux 下的)
* PATH 环境变量设置正确. (这样可以在任何目录下都可以使用工具)
* 文件是 HelloWorld.java, 内容是:
public class HelloWorld
{
public static void main(String[] args)
{
System.out.println("Hello World!/n");
System.exit(0);
}
}
首先这个文件一定要写对, 如果对 c 熟悉的话, 很有可能写成这样:
public static void main(int argc, String[] argv)
{
....
}
这样是不对的, 不信可以试一试. 由于手头没有 java 的规范, 所以
作如下猜想: java 的 application 程序, 必须以 public static void main(String[])
开始, 其他不一样的都不行.
到现在为止, 我们设置方面只设置了 PATH.
1, 当前路径就是指你的 .class 文件在当前目录下,
[HelloWorld]$ javac HelloWorld.java //这一步不会有多大问题,
[HelloWorld]$ java HelloWorld // 这一步可能就会有问题.
如果出了象开头那样的问题, 首先确定不是由于敲错命令而出错. 如果没有敲错命
令,那么接着做: