使用javac仅编译主类文件时是否会自动编译同目录下的其他关联Java文件?
Java仅编译主类时被依赖非主类修改自动生效的底层逻辑
1. Java编译器的默认隐式编译规则
当你执行javac 主类名.java命令时,编译器并不会只编译你指定的单个源文件,会按以下逻辑处理依赖:
- 首先解析主类代码中所有直接、间接引用的类,在默认类路径(当前执行命令的文件夹属于默认类路径)下查找对应类的
.java源文件和已生成的.class字节码文件 - 对比同一类的源文件与字节码文件的最后修改时间:如果源文件的修改时间晚于字节码文件,或者字节码文件不存在,编译器会自动编译该源文件,生成最新的字节码
- 你修改的非主类被主类依赖,修改后源文件时间比旧字节码新,就会被编译器自动重新编译,运行时加载的自然是修改后的代码
- 如果要关闭自动编译依赖类的行为,可以给
javac加-implicit:none参数,此时编译器只会编译你显式指定的源文件
2. IDE场景的额外说明
如果你是通过IDEA、Eclipse等IDE直接运行主类,大部分IDE默认开启了「自动构建」配置:
- 你修改代码保存后,IDE会在后台自动增量编译修改过的文件
- 运行主类时直接调用已经编译好的最新字节码,看起来也是仅运行主类就加载了修改后的内容
简单验证方式
你可以通过以下操作确认该逻辑:
- 首次编译主类后,删除被依赖的非主类的
.class文件,直接运行主类会抛出类找不到的异常 - 修改非主类代码后,仅执行
javac 主类名.java,查看非主类.class文件的修改时间,会和主类.class的修改时间一致
内容的提问来源于stack exchange,提问作者mp3001
相关产品推荐
相关产品推荐

