javac如何自动编译类的依赖关系

pai*_*dly 14 java import javac package

给定以下目录结构:

/top
   |--- wrk
          |--- pkg
                  |--- A.java
                  |--- B.java
Run Code Online (Sandbox Code Playgroud)

假设两个文件A.java,并B.java包含下面的代码,分别为:

// Filename: A.java
package pkg;
class A { B b; }

// Filename: B.java
package pkg;
class B {...}
Run Code Online (Sandbox Code Playgroud)

假设当前目录是 /top/wrk

为什么javac -cp . pkg/A.java即使我们还没有编译,命令也能成功运行B.java

此外,如果当前目录是/top/wrk/pkg命令javac A.java工作.怎么会这样?

CKi*_*ing 9

为什么命令javac -cp.即使我们还没有编译B.java,pkg/A.java也能正常工作

当你编译A.java,编译; B.java以及因为两者A.javaB.java都在同一个包.只要两个软件包都存在于目录中并从目录编译,它就会工作B.javaA.java(如果B是公共的)不同的软件包中.wrkA.javawrk

Oracle文档javac :

如果未指定-sourcepath选项,则还会在用户类路径中搜索源文件.

甲骨文文件CLASSPATH

类路径的默认值是"."

如果你还没有设置CLASSPATH,它将被默认为..随后,sourcepath也将.因为默认值sourcepath相同CLASSPATH.您可以.通过编译A.java使用确认默认源路径设置为javac -verbose -g pkg\A.java.请注意,编译器正在查找当前目录中的.java文件:

[parsing started pkg\A.java] [parsing completed 29ms] [search path for source files: [.]]

要确认sourcepath设置为CLASSPATH,您可以尝试通过编译使用来更改CLASSPATH使用该-cp选项.这次不会编译,因为你已经覆盖了to ,那也是默认的.这是输出:A.javajavac -cp C:\ -verbose -g pkg\A.javaA.javaCLASSPATHC:\sourcepath

[parsing started pkg\A.java] [parsing completed 26ms] [search path for source files: [C:\]] pkg\A.java:3: cannot find symbol symbol : class B

此外,如果当前目录是/ top/wrk/pkg,则命令javac A.java可以工作.怎么会这样?

无论是否B.class存在,这都不起作用pkg

免责声明:我只能在Windows上确认此行为,但我非常怀疑它在其他操作系统上应该有所不同.