为什么先折腾环境
很多人学 Java 的第一天就卡在环境上:java -version 能输出,javac 却提示“不是内部或外部命令”;IDEA 能打开项目,编译时报“无效的目标发行版”;同一个机器装了 JDK 8 和 JDK 17,命令行和 IDEA 用的却不是同一个版本。环境问题不解决,后面 Spring Boot 的坑会一个接一个。
这篇文章按“装 JDK → 配环境变量 → 配 IDEA → 跑第一个程序”的顺序,把 2022 年最常见的 JDK 8/11/17 环境问题一次讲清楚。
版本怎么选
| 版本 | 类型 | 建议 |
|---|---|---|
| JDK 8 | LTS | 老项目、公司历史系统仍然常见,语法保守 |
| JDK 11 | LTS | 过渡版本,部分公司使用 |
| JDK 17 | LTS | 2021 年发布,Spring Boot 3.x 的最低要求,新项目优先 |
学习阶段建议至少装 JDK 8 和 JDK 17 两个版本:用 8 跑老教程,用 17 跟新框架。不要只装一个“最新版”,也不要同时把多个 javapath 留在 PATH 最前面。
Windows:安装与 JAVA_HOME
安装时路径尽量不要带中文和空格,例如 C:\dev\jdk-17。安装完成后配置系统环境变量:
JAVA_HOME = C:\dev\jdk-17
Path 追加:
%JAVA_HOME%\bin
注意两点:
JAVA_HOME指向 JDK 根目录,不是bin目录;- 如果安装器自动写入了
C:\Program Files\Common Files\Oracle\Java\javapath,要把它从 PATH 中删除或下移,否则命令行可能优先命中另一个 Java。
Linux 上常见做法是解压到 /usr/local/jdk-17,然后:
sudo tee /etc/profile.d/java.sh >/dev/null <<'EOF'
export JAVA_HOME=/usr/local/jdk-17
export PATH="$JAVA_HOME/bin:$PATH"
EOF
source /etc/profile.d/java.sh
IDEA:三处版本要一致
IDEA 里至少有三处 JDK 配置,任何一处不一致都可能出现“命令行能跑、IDEA 报错”:
- Project Structure → Project:Project SDK 和 Language level;
- Settings → Build Tools → Maven → Importing:Maven 使用的 JDK;
- Settings → Build Tools → Compiler → Java Compiler:Target bytecode version。
如果是 Maven 项目,还要看 pom.xml:
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
新项目更推荐用 <maven.compiler.release>17</maven.compiler.release>,它同时约束 API 和字节码版本,避免“用 17 编译、却调用了 8 没有的 API”。
第一个程序
新建 Hello.java:
public class Hello {
public static void main(String[] args) {
String name = args.length > 0 ? args[0] : "Java";
System.out.println("Hello, " + name + "!");
System.out.println("Java version: " + System.getProperty("java.version"));
}
}
命令行编译运行:
javac -encoding UTF-8 Hello.java
java Hello 世界
输出类似:
Hello, 世界!
Java version: 17.0.x
常见坑
1. java 能用,javac 不能用
说明 PATH 里只有 JRE 或 javapath,没有 JDK 的 bin。执行:
where java
where javac
Windows 下把 %JAVA_HOME%\bin 放到最前面,再开一个新的命令行窗口(旧窗口不会自动刷新环境变量)。
2. 多版本冲突
where java
# Linux/macOS
which -a java
按输出顺序确认实际使用的是哪一个。临时切换可以只改当前窗口:
set JAVA_HOME=C:\dev\jdk-8
set Path=%JAVA_HOME%\bin;%Path%
3. UnsupportedClassVersionError
这个错误的本质是“编译时 JDK 高,运行时 JDK 低”。常见字节码版本:
| JDK | major version |
|---|---|
| 8 | 52 |
| 11 | 55 |
| 17 | 61 |
| 21 | 65 |
报 class file version 61.0,说明类是用 JDK 17 编译的,但运行环境是 8/11。统一编译和运行版本即可。
4. IDEA 改了版本仍然报错
依次检查:Project SDK、Language level、Maven Importer JDK、Compiler target、pom.xml 的 compiler 配置,最后执行:
mvn clean compile
并 File → Invalidate Caches / Restart。IDEA 的缓存和 Maven 的 target 目录都可能保留旧字节码。
5. 中文乱码
Windows 控制台默认编码可能是 GBK。编译时显式指定:
javac -encoding UTF-8 Hello.java
java -Dfile.encoding=UTF-8 Hello
IDEA 中把 File Encodings 统一为 UTF-8,并勾选 Transparent native-to-ASCII conversion(仅 properties 文件需要时)。
验证清单
java -version、javac -version输出版本一致;echo %JAVA_HOME%(Linux 用echo $JAVA_HOME)指向 JDK 根目录;- IDEA 的 Project SDK、Language level、Maven Importer、Compiler target 一致;
- 能编译并运行
Hello.java,中文输出正常; java -XshowSettings:properties -version能看到java.home和file.encoding。
三个高频问题速查
公司内网下载不了 JDK 怎么办? 优先使用公司镜像源或 OpenJDK 发行版(Temurin、Zulu、Corretto),不要从不明网盘下载修改版安装包;安装后同样核对 java -version 与 javac -version。
装了多个 JDK,Maven 怎么固定版本? 除了 JAVA_HOME,还要在 ~/.m2/settings.xml 或 IDE 的 Maven Runner 里指定 JDK;命令行可用 mvn -version 确认 Maven 实际使用的 Java 版本,避免“IDEA 是 17、Maven 是 8”。
IDEA 控制台中文乱码? 把 IDEA 的 File Encodings、Run Configuration 的 VM options(-Dfile.encoding=UTF-8)和终端编码统一;Windows 下不要只改其中一处。
评论