javac用于编译Java源文件,基本格式为javac [选项] 源文件路径;需注意文件名与类名一致、正确使用-d指定输出目录、-sourcepath处理依赖、-encoding解决编码问题,并确保编译与运行JDK版本兼容。

javac 命令的基本用法
编译 Java 源文件必须用 javac,不是 java——后者只负责运行已编译的 .class 文件。常见错误是把 javac HelloWorld.java 写成 java HelloWorld.java,结果报错 Error: Could not find or load main class HelloWorld.java。
基本格式是:javac [选项] 源文件路径。源文件名必须带 .java 后缀,且类名与文件名严格一致(包括大小写)。
-
javac HelloWorld.java:当前目录下编译,生成HelloWorld.class -
javac src/Main.java:编译子目录中的文件,输出.class默认也在src/下 - 若含中文路径或空格,务必用英文引号包裹,如
javac "D:/my project/Hello.java"
处理包结构时的 -d 和 -sourcepath
有 package 声明时,javac 会按包名创建目录层级。不指定输出目录,.class 会和源码混在一起,后续 java 运行时容易找不到类。
推荐始终用 -d 指定输出根目录。例如源文件是 src/com/example/Tool.java,其中声明了 package com.example;:
立即学习“Java免费学习笔记(深入)”;
在WINDOWS下,编译时的路径是WINDOWS安装目录。 ; 在命令行模式下,PHP.INI的查找路径可以用 -C 参数替代。 ; 该文件的语法非常简单。空白字符和用分号´;´开始的行被简单地忽略(就象你可能 ; 猜到的一样)。 章节标题(例如 : [FOO])也被简单地忽略,即使将来它们可能 ; 有某种的意义。 ; ;
-
javac -d bin src/com/example/Tool.java→ 输出到bin/com/example/Tool.class - 若依赖其他未编译的源文件(比如
src/com/example/Util.java),加-sourcepath src让javac能自动找并编译它们 - 漏掉
-sourcepath可能报cannot find symbol,尤其在跨包引用时
常见编译失败原因和对应检查点
报错信息里带 error: 的基本都是编译期问题,和 JVM 无关。别急着查环境变量,先看这几项:
- Java 版本不匹配:用
javac -version确认版本,若源码用了var或switch表达式,需 JDK 10+;JDK 17 编译默认用--release 17,否则可能因目标字节码版本不兼容被拒绝 - 类路径污染:当前目录下有旧的
XXX.class,而你改了XXX.java却没删旧 class,javac可能误读符号表,导致奇怪的cannot find symbol -
编码问题:源文件含中文但未指定编码,Windows 默认 GBK,Linux/macOS 默认 UTF-8,用
javac -encoding UTF-8 Main.java显式声明更稳妥 - 模块系统干扰:JDK 9+ 若项目用了
module-info.java,但没配--module-path或--add-modules,编译直接失败
运行前必须确认 classpath 和主类名
编译成功只是第一步。java 命令不认 .java 或 .class 文件名,它要的是**全限定类名**(fully qualified name),且依赖 -cp 或 CLASSPATH 找到对应目录或 JAR。
-
java -cp bin com.example.Main:从bin/开始找com/example/Main.class - 若省略
-cp bin,java只在当前目录搜,哪怕Main.class就在bin/里也找不到 - 主类名不能带
.class后缀,也不能写成路径形式(如bin.com.example.Main) - 入口方法签名必须是
public static void main(String[] args),少一个修饰符或参数类型不对,编译通过但运行时报NoClassDefFoundError或NoSuchMethodError
最易忽略的是:编译和运行用的 JDK 版本不一致,或者 javac 生成的 class 文件版本高于 java 支持的版本——这时候报错是 Unsupported major.minor version,得回头调 -source 和 -target(或 --release)参数。









