例子

我写的简单的例子在 bitbucket 上.

Java packages

当初看 Oracal Java Tutorial 的时候一直没搞清楚 package 和文件系统的关系, 以及 CLASSPATH 的意思. 今天特别去看了一下, 做个笔记.

虽然标准没有要求, 不过大部分 Java 的实现都依赖文件系统的树状结构来管理源文件和 class 文件, 比如说, 某个文件内容是

Rectangle.java:
package graphics;
...

那么这个文件应该在 somewhere/graphics/Rectangle.java

javac 可以设定 -d 参数来控制 class 文件输出路径, 使得 class 编译出来不和源文件在一起, 如 p1/sources/com/example/graphics/Rectangle.java 编译出来到 p2/classes/com/example/graphics/Rectangle.class.

那么 p2/classes 就称为 classpath, 是用来寻找 com.example.graphics.Rectangle 的起始路径. 应该加到 CLASSPATH 中.

javac 和 java 都用 CLASSPATH. 所以如果 p2/classes 在 CLASSPATH 中 并且某个 java 或 class 中有

import com.example.graphics

那么 javac 和 java 会去 p2/classes/com/example/graphics 中找 Rectangle.class 文件.

JAR 操作

操作 命令
创建 jar jar cf JAR_FILE CLASS_FILES
检视 jar jar tf JAR_FILE
运行 jar java -jar JAR_FILE

jar 中除了 class 文件, 还可以包含源文件甚至任意数据.

另外 CLASSPATH 除了上面的 p2/classes 还可以是某个 jar 文件, 这样 java/javac 也会去 jar 文件中寻找.