给定以下目录结构:
/top
|--- wrk
|--- pkg
|--- A.java
|--- B.java
假设A.java
和B.java
这两个文件分别包含如下代码:
// Filename: A.java
package pkg;
class A { B b; }
// Filename: B.java
package pkg;
class B {...}
假设当前目录是/top/wrk
为什么命令 javac -cp 。 pkg/A.java
即使我们还没有编译 B.java
也能成功运行吗?
此外,如果当前目录是 /top/wrk/pkg
,则命令 javac A.java
有效。怎么会这样?
最佳答案
Why does the command javac -cp . pkg/A.java work successfully even though we have not yet compiled B.java
当你编译A.java
时,编译器也会编译B.java
,因为A.java
和B .java
在同一个包中。即使 B.java
与 A.java
在不同的包中(前提是 B
是公共(public)的),只要这两个包存在于 wrk
目录中,您从 wrk
目录编译 A.java
。
来自Oracle documentation对于 javac
:
If the -sourcepath option is not specified, the user class path is also searched for source files.
来自Oracle document对于 CLASSPATH
The default value of the class path is "."
如果您没有设置CLASSPATH
,它将默认为.
。随后,sourcepath
也将是 .
,因为默认的 sourcepath
与 CLASSPATH
相同。您可以确认默认源路径设置为 .
,方法是使用 javac -verbose -g pkg\A.java
编译 A.java
。请注意,编译器正在当前目录中查找 .java
文件:
[开始解析 pkg\A.java]
[解析完成29ms]
[源文件搜索路径:[.]]
要确认 sourcepath
设置为 CLASSPATH
,您可以尝试使用 -cp
更改 CLASSPATH
> 使用 javac -cp C:\-verbose -g pkg\A.java
编译 A.java
的选项。 A.java
这次不会编译,因为您已经将 CLASSPATH
覆盖到 C:\
而这就是 sourcepath
也将默认为。这是输出:
[开始解析 pkg\A.java]
[解析完成26ms]
[源文件搜索路径:[C:\]]
pkg\A.java:3: 找不到符号
符号:B 类
Also if the current directory is /top/wrk/pkg then the command javac A.java works. How so?
无论 B.class
是否存在于 pkg
中,这都不会起作用
免责声明:我只能在 Windows 上确认此行为,但我非常怀疑它在其他操作系统上应该有任何不同。
关于java - javac如何自动编译一个类的依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30527632/