Java 的 Class Path 和 Package
作者:网络转载 发布时间:[ 2013/7/29 10:29:57 ] 推荐标签:
好了, 先把源程序都放在 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 的这一套工具组合起来使用, 中小型工程(五六十个类), 还是应付得下来的.
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11