java - javac如何自动编译一个类的依赖

标签 java import package javac

给定以下目录结构:

/top
   |--- wrk
          |--- pkg
                  |--- A.java
                  |--- B.java

假设A.javaB.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.javaB .java 在同一个包中。即使 B.javaA.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 也将是 .,因为默认的 sourcepathCLASSPATH 相同。您可以确认默认源路径设置为 .,方法是使用 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/

相关文章:

python - 导入多个类的最佳方法

typescript - 了解 TypeScript 导入、模块和命名空间

reactjs - yarn 网络连接出现问题

java - 检索子包类的资源

java - ExecutorService(特别是 ThreadPoolExecutor)线程安全吗?

java - Java Swing 上的 Facebook 共享按钮

java - 无法解析与前缀 'diffgr' 关联的命名空间。在 Castor 中

java - 是否可以以编程方式将 Eclipse RCP 按钮设置为 'checked' ?

python - 来自 __future__ import absolute_import 不起作用?子模块不可见

python - FutureWarning : The alias _() will be deprecated. 使用 _i18n() 代替