Javac 如何处理多个文件、目录、类 和源代码?

How does Javac work for multiple files, directories, classes and source?

我正在尝试弄清楚 javac 如何处理源路径、class路径和预构建的 classes 等内容。我正在尝试阅读文档,但不能真正理解它。

我试着想出了下面的一些示例案例。

  1. 如果我正在编译一个没有依赖关系的文件 onlyfile.java,它有 2 个 classes A 和 B,并且 class A 使用 class B , class B 需要在 A 之前 defined/declared 吗?还是 javac 很聪明,会多次通过或类似的事情?

  2. root.java 在同一文件夹中的文件 file2.java 中使用另一个 class。如果我执行 javac root.java ,javac 如何知道在文件夹中搜索 class 文件,如果找不到,则搜索源文件?

  3. 如果 file2 位于子目录中,上述如何工作?

编辑: 我在某处读到,导入只是一种减少打字的方法,而不是 "loading" python 中的任何东西。 假设我只构建 1 个 java 文件,它使用多个其他 classes,并且这些 class 文件已经存在。如果没有导入,class 对象的 a.b.c.d 部分已经告诉我在哪里搜索 class 文件,那么为什么要使用 cp 选项?

对于前两个选项,请尝试 javac *.java

重复 Compiling Multiple Classes (Console) in Java

1) 如果编译使用 class B 的 class A,那么 class B 也将被强制执行。如果编译classB(A内部使用,B内部不使用A),则不会强制classA。查找更多详细信息结束示例 here.

2) javac 在源路径和 class 路径中搜索。如果你 运行 javac 没有像 javac A.java 这样的参数,它会将 classpath 和 sourcepath 设置为当前目录。如果请求的 class 在 classpath 和 sourcepath 中均未找到,您将遇到编译错误。

3) Java 对项目结构有严格的规定。您不能简单地将源文件放置到另一个文件夹而不更新文件内容。

项目中的每个文件夹都应具有与包声明相关的文件夹层次结构。

Definition: A package is a grouping of related types providing access protection and name space management.

例如,如果您有 class A.java 和这样的包声明

package com.mycompany;

对应的文件夹结构应该是这样的:

com/mycompany/A.java

如果您遵循此规则,编译器将能够像我在 #1 中解释的那样解决依赖关系。查找更多信息 here