说,目录结构看起来像这样:
src/
- A.java
- A_b.java
- A_c.java
对于初学者/业余阶段,不使用像Maven或Gradle这样的构建系统,很少是一个罐子,甚至可以打包所有类,并使其可导出。
A_b.java
的内容:
public class A_b {
public static void writeWords() {
System.out.println("words");
}
}
A_c.java
的内容:
public class A_c {
public static void writeMoreWords() {
System.out.println("more words");
}
}
A.java
的内容:
public class A {
public static void main(String[] args) {
String name = "anonymous";
for (int i = 0; i < args.length; i++)
if (args[i].equals("-name"))
name = args[i+1];
System.out.println(String.format("Hello, %s!", name));
System.out.println("Now A_b will write some words:");
A_b.writeWords();
System.out.println("Now A_c will write some more words:");
A_c.writeMoreWords();
}
}
当我尝试这样做时:
$ ls
data src
$ javac src/A.java
我有一个错误,说:
src/A.java:11: error: cannot find symbol
A_b.writeWords();
^
symbol: variable A_b
location: class A
src/A.java:13: error: cannot find symbol
A_c.writeMoreWords();
^
symbol: variable A_c
location: class A
2 errors
^
的原因是,编译器不知道A.java
需要哪些文件来编译 - 这被称为classPath。默认情况下,编译器的大多数版本都将考虑所有位于同一级别的Java文件作为classPath的一部分,这就是为什么它可以工作的原因:
$ cd src
$ javac A.java
但这不是
$ java src/A.java
现在,为了确保我们可以从顶级级别进行工作,我们需要确保正确设置了类路径。
实现这一目标的一种方法是对每个依赖项明确说明:
$ javac -cp . src/A.java src/A_b.java src/A_c.java
另外,这也有效:
$ javac -cp . src/*.java
还有CLASSPATH
环境变量可以在调用javac
之前设置,例如:
$ CLASSPATH=$(pwd)/src javac src/A.java
要在当前工作目录中创建*.class
文件,我们有-d
标志:
$ CLASSPATH=$(pwd)/src javac -d . src/A.java
然后,很容易运行它:
$ java A -name world
Hello, world!
Now A_b will write some words:
words
Now A_c will write some more words:
more words