javac 是 Java 源码编译的唯一标准入口,将 .java 编译为 .class 字节码;需严格匹配包结构路径,常见错误包括命令未找到、参数不兼容、包不存在、中文乱码及 javac/java 混淆。

javac 命令是 Java 源码编译的唯一标准入口
Java 源文件(.java)不能直接运行,必须先用 javac 编译成字节码(.class)。这是 JDK 自带的编译器,不依赖 IDE 或构建工具。
最简形式就是:javac Hello.java —— 会生成同名的 Hello.class 文件。注意:它默认只编译指定文件,不会自动递归处理依赖的其他类,除非这些类也在当前目录且已编译完成或源码可见。
编译带包结构的 Java 文件必须匹配目录路径
如果源码声明了包,比如 package com.example;,那么 Hello.java 就不能放在任意目录下乱放,而必须位于 com/example/Hello.java 路径中。
此时编译命令要从包根目录执行(即 com 的父目录),否则 javac 会报错 error: class Hello is public, should be declared in a file named Hello.java 或更常见的 error: cannot find symbol。
立即学习“Java免费学习笔记(深入)”;
- 正确做法:进入源码根目录(如
src/),运行javac com/example/Hello.java - 或者用
-d指定输出目录,例如:javac -d out com/example/Hello.java,这样.class会按包结构生成在out/com/example/下 - 千万别在
com/example/目录里直接执行javac Hello.java——javac会认为包名是空的,导致符号解析失败
常见编译失败原因和对应修复
javac 报错往往不是语法问题,而是环境或路径配置偏差。以下几种最典型:
在WINDOWS下,编译时的路径是WINDOWS安装目录。 ; 在命令行模式下,PHP.INI的查找路径可以用 -C 参数替代。 ; 该文件的语法非常简单。空白字符和用分号´;´开始的行被简单地忽略(就象你可能 ; 猜到的一样)。 章节标题(例如 : [FOO])也被简单地忽略,即使将来它们可能 ; 有某种的意义。 ; ;
-
javac: command not found:系统找不到javac,说明 JDK 未安装,或JAVA_HOME未设,或PATH没包含$JAVA_HOME/bin -
error: invalid flag: --release:用了高版本 JDK 的参数(如--release 8),但在低版本(如 JDK 8)上运行;反过来,JDK 8 也不认识--enable-preview -
error: package xxx does not exist:依赖的类没编译、不在 classpath、或包路径不匹配;可用-cp显式加依赖,例如:javac -cp lib/some.jar Main.java - 中文字符乱码:源文件含中文字符串或注释时,编译报
illegal character,需加-encoding UTF-8参数
javac 和 java 命令分工必须分清
javac 只负责翻译源码,不执行;java 才是加载并运行 .class 文件的命令。两者对路径、类名、包名的要求逻辑不同,容易混淆。
例如编译成功后运行:java com.example.Hello(注意:这里是类全名,不含 .class 后缀,且路径由 java 自动映射到目录结构);但如果你写成 java com/example/Hello 或 java Hello.class,就会报 Could not find or load main class。
另外,java 默认在当前目录找类,若 .class 在 out/ 下,就得加 -cp out;而 javac 默认不查 classpath,除非你用 -cp 告诉它去哪找依赖源码或已编译类。
真正容易卡住的地方,往往不是语法,而是这俩命令对“当前在哪”“类名怎么写”“路径怎么算”的隐含约定——它们不报错,但就是不工作。









