javac如何确定源文件依赖?求OpenJDK相关实现类指引
编译依赖推断的具体步骤
当javac处理Bar.java时,按以下流程推断并触发依赖源文件的编译:
- 语法解析与符号识别:
javac首先解析Bar.java生成抽象语法树(AST),当遇到Foo类型引用时,启动符号查找流程。 - 查找候选文件:先在类路径中查找已编译的
Foo.class,如果未找到或Foo.java的修改时间晚于现有Foo.class,则在源文件路径(默认当前目录)中定位Foo.java。 - 加入编译队列:确认
Foo.java需要编译后,将其加入编译任务队列,javac会安排编译顺序(通常先编译依赖项)。 - 依赖编译结果复用:
Foo.java编译完成生成Foo.class后,javac继续完成Bar.java的剩余编译步骤,使用刚生成的Foo.class进行类型校验等操作。
OpenJDK中实现依赖推断的核心类
在OpenJDK的jdk.compiler模块下的com.sun.tools.javac包中,核心相关类包括:
com.sun.tools.javac.api.JavacTask:编译任务的顶层入口,统筹依赖发现、任务调度等全流程。com.sun.tools.javac.comp.Enter:负责将类、方法等符号纳入符号表,过程中会触发对依赖类的查找逻辑。com.sun.tools.javac.file.JavacFileManager:管理源文件与class文件的搜索路径,负责定位依赖的源文件,是判断是否需要编译的关键组件。com.sun.tools.javac.main.JavaCompiler:编译执行的核心类,负责调度依赖源文件的编译顺序与执行。com.sun.tools.javac.deps.DependencyAnalyzer:专门用于分析源文件间的依赖关系,确定需要编译的源文件集合。
内容的提问来源于stack exchange,提问作者merlin2011
相关产品推荐
相关产品推荐

