Contents
  1. 1. 管理原始码与位码
    1. 1.1. 分目录管理
    2. 1.2. 分包管理
  2. 2. 版本管理

分目录、分包管理原始码与位码,版本管理(ing)

管理原始码与位码

分目录管理

期望原始码都整理在一个目录src下,而位码都输出到classes目录下。同时注意到存在的问题:实际项目中有数以万计的类,如果每次都要重新将.java编译成.class,那会是非常费时的工作。

例如:
(1).编辑
添加 src/Console.java 文件

1
2
3
4
5
class Console{
public static void writeLine(String text){
System.out.println(text);
}
}

添加 src/Helloworld.java 文件

1
2
3
4
5
class Helloworld{
public static void main(String args[]){
Console.writeLine("Hello World");
}
}

(2).编译

1
$ javac -sourcepath src -d classes src/Helloworld.java

-sourcepath用于向编译程序(javac)指定源文件的搜索路径,也就是原始码的位置。-d指定放置生成的类文件的路径,也就是位码的位置。如果再用-verbose监测,可以看到大致的过程是:

  1. 源文件的搜索路径——搜索原始码
  2. 类文件的搜索路径——搜索位码(包括默认和classpath)
  3. 检查需要使用的各位码,如果存在且无变化则加载,如果不存在或有变化则写入

用以下命令可以感受到第3步的差别,多加了-cp classes,把位码的输出目录也加到位码的搜索路径中去,这样再次编译的时候若Console.java没有变化,就不需要写入Console.class,而可以直接使用它了。

1
$ javac -sourcepath src -d classes -cp classes src/Helloworld.java

(3).执行

1
$ java -cp classes Helloworld


分包管理

只分目录并不够,还期望根据类的功能将原始码放置在不同目录下,另外也得考虑团队合作下类名称可能重复的问题。从实体和虚拟上,都需要分门别类地管理,package就出现了。以网址(如com.stackess)命名package,可以保证唯一性。
package的管理能力在于:

  1. 原始码按package文件夹层级放置
  2. 位码按package文件夹层级放置
  3. package名+class名构成完全吻合名称,这才是类的大名
  4. 类或方法在包内、包间的权限管理,只有public可在包间使用

当编译程序在原始码中看到一个完全吻合名称,直接去搜索这个类。但为了方便,没有包管理的类名称也是可以的,编译程序会机智地按如下顺序查找类的大名:

  1. 在同包中寻找
  2. 比对import声明(默认import java.lang)

例如:
(1).编辑
添加 src/com/stackess/util/Console.java 文件

1
2
3
4
5
6
package com.stackess.util;    //包
public class Console{ //声明public!
public static void writeLine(String text){
System.out.println(text);
}
}

添加 src/com/stackess/Helloworld.java 文件

1
2
3
4
5
6
package com.stackess;
class Helloworld{
public static void main(String args[]){
com.stackess.util.Console.writeLine("Hello World"); //完全吻合名称
}
}

或者用import给 src/com/stackess/Helloworld.java 偷懒

1
2
3
4
5
6
7
package com.stackess;
import com.stackess.util.Console;
class Helloworld{
public static void main(String args[]){
Console.writeLine("Hello World"); //只是类名称
}
}

(2).编译

1
$ javac -sourcepath src -d classes -cp classes src/com/stackess/Helloworld.java

(3).执行

1
$ java -cp classes com.stakcess.Helloworld

别忘了完全吻合名称才是类的大名,这样java -cp classes/com/test Helloworld是错的,这可没有import给你用。


版本管理

Contents
  1. 1. 管理原始码与位码
    1. 1.1. 分目录管理
    2. 1.2. 分包管理
  2. 2. 版本管理