好了, 先把源程序都放在 source 目录下, 使 source 成为当前目录, 然后编译一下, 呵呵, 出错了,Main.java:1: Package pktest not found in import.import pktest.*;    这里涉及到类路径中包是怎么查找的, 前面我们做了一点假设: "只要包含了这个类算找到了这个类", 现在有问题了. 其实 jdk 的 工具 javac javajavadoc 都需要查找类, 看见目录, 认为是包的名字, 对于import 语句来说,一个包对应一个目录. 这个例子中, import pktest.*, 我们知道类路径可以包含一个目录, 那么以那个目录为根, 比如有个目录 /myclass, 那么会在查找/myclass/pktest 目录及其下的类. 所有的都找遍, 如果没有会报错. 由于现在的类路径只有当前目录, 而当前目录下没有 pktest 目录, 所以会出错. 类路径还可以包含 .jar .zip 文件, 这些是可以带目录的压缩包, 可以把 .jar .zip文件看做一个虚拟的目录, 然后和目录一样对待了.

  好了, 应该知道怎么做了吧, 修改后的目录结构如下:

PackageTest
|
|__source   Main.java
|
|__pktest   PackageTest.java   PackageSecond.java
|
|__subpk  PackageSub.java

  然后重新编译, 运行, 哈哈, 通过了. 我们再来运行一下 PackageTest.

  [source]$ java pktest/PackageTest

  怎么又出错了?

  Exception in thread "main" java.lang.NoClassDefFoundError: pktest/PackageTest 是这样的, java 所要运行的是一个类的名字, 它可不管你的类在什么地方, 象我们前面所讨论的一样来查找这个类, 所以它把 pktest/PackageTest 看成是一个类的名字了, 当然会出错了, 应该这么做,

  [source]$ java pktest.PackageTest

  大家应该明白道理吧, 我不多说了. 注意 javac 不一样, 是可以指明源文件路径的, javac 只编译, 不运行, 查找类也只有在源文件中碰到 import 时才会做, 与源文件所在的包没有关系.   似乎还又些不好的地方, 怎么生成的 .class 文件这么分散呀, 看着真别扭. 别急,javac 有一个 -d 命令行参数, 可以指定一个目录, 把生成的 .class 文件按照包给你好好地搁在这个目录里面.

[source]$ mkdir classes
[source]$ javac -d classes pktest/PackageTest.java
[source]$ javac -d classes Main.java

  那么运行怎么运行呢?

[source]$ cd classes
[classes]$ java pktest.PackageTest
[classes]$ java Main

  可以了. 其实 jdk 的这一套工具小巧简单, 功能强大, 不会用或者用错其实不关工具的事, 关键是明白工具背后的一些原理和必要的知识. 集成环境是很好,但是它屏蔽了很多底层的知识, 不出错还好, 一旦出错, 如果没有这些必要的知识很难办, 只好上 bbs 问, 别人只告诉了你解决的具体方法, 下一次遇到稍微变化一点的问题又不懂了. 所以不要拘泥于工具, java 的这一套工具组合起来使用, 中小型工程(五六十个类), 还是应付得下来的.