身边不少准备从零开始学Java的朋友,都是信心满满地买了课、收藏了一堆学习路线,结果卡在了第一步——环境配置。其实这个坎儿并不难,难的是市面上的教程要么默认你懂了一堆前置概念,要么省略了最容易翻车的细节,照着敲完命令,cmd窗口里蹦出一句“不是内部或外部命令”,人直接懵了。
这篇文章我打算把Java环境配置这件事从头到尾拆开揉碎,结合我这些年实际带人、帮人排查的经验,把JDK版本选择、下载安装、环境变量设置、命令行验证、IDE配置和常见报错定位全部讲清楚。按这套流程走,几乎不会再遇到“配了三小时还没搞定”的绝望情况。
1. 先搞懂JDK、JRE与JVM,才知道环境配置究竟在配什么
很多人在配置环境之前,根本没弄明白自己到底在配什么,所以一旦出错就完全没法判断是哪一步的问题。其实Java环境配置一点都不神秘,它背后就是三个概念之间的关系。
1.1 白话版Java运行机制:一次编译,到处运行到底怎么实现的
Java最大的卖点是“一次编译,到处运行”,这句话的实际含义是:你写的Java代码,会被编译成一种叫“字节码”的中间文件(.class文件),这个文件不面向任何具体的操作系统,只面向Java虚拟机(JVM)。JVM在Windows上有Windows版本,在macOS上有macOS版本,在Linux上有Linux版本,但它们认识的字节码是完全相同的。
打个比方:字节码就像一份“普通话剧本”,JVM就是舞台,Windows、macOS、Linux这些操作系统是不同的剧院。同一个剧本,在每个剧院的舞台上都能按相同的方式演出,只是因为剧院不同,舞台搭建的方式略有差异。你在Windows上编译出来的.class文件,拷贝到Linux上只要装了对应的JVM,依然能跑,这就是Java跨平台的本质。
所以环境配置要解决的核心问题,就是让你的电脑上有一个“能编译Java代码的工具”和“能运行Java字节码的虚拟机”,仅此而已。
1.2 JDK、JRE、JVM三者关系:为什么只需要装一个JDK就够了
很多新手会在这一步被搞晕,因为教程里一会儿说JDK,一会儿说JRE,一会儿又冒出来一个JVM,感觉像是要装三样东西。其实它们的包含关系非常清晰:
- JVM(Java Virtual Machine):Java虚拟机,负责运行.class字节码文件,是Java跨平台的基石。
- JRE(Java Runtime Environment):Java运行环境,包含JVM和一些基础的类库,作用是让你能“运行”Java程序,但它不能编译代码。
- JDK(Java Development Kit):Java开发工具包,包含完整的JRE,还额外提供了javac编译器、jar打包工具、javadoc文档工具等一系列开发工具,作用是让你能“开发”Java程序。
换句话说,JDK是大包,里面既带开发工具,又带运行环境。所以对于要写Java代码的人来说,只需要安装一个JDK就全齐了,不需要单独再去装一遍JRE。而且自从JDK 9之后,Oracle官方发布的JDK安装包里已经不再单独提供独立的JRE安装选项了,再去找什么“安装JRE”的教程纯属浪费时间。
1.3 JAVA_HOME、PATH、CLASSPATH三个环节各自的作用
环境变量配置,本质上是在告诉操作系统三件事。这三个变量经常被混在一起讲,很多人直接照着配,配完了也不知道哪个在起作用,出了问题更是无从下手。我分开说一下:
JAVA_HOME:这是一个“指路标”,专门用来指向JDK的安装目录。很多基于Java开发的工具(比如Tomcat、Maven、Gradle的启动脚本)在运行时会主动去找这个环境变量,不配它们可能跑不起来。它本身不直接参与命令执行。PATH:这才是让命令行认识java和javac命令的关键。当你在cmd里输入java -version的时候,操作系统会在PATH环境变量列出的所有目录里挨个查找有没有java.exe这个文件,找到了就执行。所以只要把JDK安装目录下的bin文件夹路径加进PATH,系统就能找到java和javac命令了。CLASSPATH:用来告诉JVM去哪里找你写好的类文件。这个变量在JDK 5之前必须手动配置成.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar,否则连最基础的运行都会报错。但JDK 5之后,JVM会默认从当前目录加载类文件,所以在绝大多数开发场景下,新手根本不需要配置CLASSPATH,配错了反而容易引出各种诡异问题。
这里我想强调一句:环境配置最核心的就是JAVA_HOME和PATH这两个,CLASSPATH直接留空就好,别画蛇添足,这是我带新手时反复念叨的一句话。
2. JDK版本和发行版该怎么选:不是越新越好,也不是越老越稳
一提到装JDK,很多新手直接去搜“JDK最新版下载”,装完发现跟教程里的界面完全不一样,配置完第二天又出现一堆兼容性问题。版本选择这件事,应该在你动手下载之前就决定好。
2.1 LTS版本时间线:Java 8、11、17、21到底差在哪
Java的版本演进有一个很特殊的节奏:Oracle每6个月发布一个普通版本,同时每段时间会指定一个长期支持版本(LTS)。LTS版本承诺在数年内持续提供安全更新和性能修复,适合生产环境使用,也是绝大多数公司实际在用的版本。
我把近几年最常见的几个LTS版本整理成了下面的表,方便你直接对照:
| 版本 | 发布时间 | 标志性新特性 | 适合人群 |
|---|---|---|---|
| Java 8 | 2014年 | Lambda表达式、Stream流、Optional | 大量老项目还在用,但语法明显过时,不适合新学者起步 |
| Java 11 | 2018年 | var局部变量类型推断、HTTP Client | 相对中庸,很多公司在Java 8向上升级时的第一站 |
| Java 17 | 2021年 | 密封类、switch模式匹配、文本块 | 目前企业和教程生态都比较成熟,推荐新学者选择 |
| Java 21 | 2023年 | 虚拟线程、record模式匹配增强 | 最新LTS,前瞻性强,但部分老工具链尚在适配期 |
Java 8在Java社区里地位很特殊,因为Spring Boot生态大量老项目基于它构建,网上老教程也特别多。但如果你是一个完完全全的新手,我依然不建议从Java 8开始学,因为后续学到的很多新语法在Java 8上是跑不通的,而Java 17和Java 21基本兼容了主流新特性,学完再去理解老项目的代码也不吃力。
2.2 Oracle JDK与OpenJDK还有Temurin,到底选谁
确认了版本之后,你会发现同样叫JDK 21,网上能下载的地方却有好几个:Oracle官网、Adoptium、Amazon Corretto、Microsoft Build of OpenJDK……选择困难症瞬间犯病。其实它们的底层代码基本相同,都源自OpenJDK项目,差别主要集中在商业授权和服务支持上。
对个人学习和绝大多数商业使用场景来说,我的建议是直接选择Eclipse Adoptium发布的Temurin版本。它是一款完全开源、免费、无商业使用限制的OpenJDK构建版,社区活跃度很高,更新也及时,在知名软件仓库和自己的官网都能找到下载入口。至于Oracle JDK,自从2019年开始对商业用途收取订阅费之后,只有在需要Oracle官方技术支持的企业场景下才需要去考虑付费订阅,个人用来学习完全没有必要。Amazon Corretto和Microsoft Build of OpenJDK也都是很可靠的选择,差异极小,按自己的使用习惯来就好。
2.3 我的选型建议:新手第一次装JDK,直接抄这份答案
如果你不想纠结,直接按下面这套组合来:
- 版本选择:JDK 17(如果想尝鲜或者确认自己电脑上不会有其他老工具的兼容性问题,选JDK 21也可以,但JDK 17对新手来说最稳)。
- 发行版选择:Temurin 17,也就是Eclipse Adoptium的构建版。
- 配套工具:后面写代码用IntelliJ IDEA Community版,编译运行全在IDE里完成,几乎不需要接触命令行,但这篇文章里我还是会把命令行验证方法讲透。
另外补充一个非常实用的建议:安装JDK的路径要避开中文、空格和特殊符号。比如不要装在C:\Program Files\Java下,虽然它本身路径里带空格也能工作,但后续配置Maven、Gradle等工具时,带空格的路径偶尔会引发解析错误,排查起来极其痛苦。我一般推荐装在C:\dev\java\jdk-17或者D:\Java\jdk-17这种自定义目录下,省心。
3. Windows系统JDK安装全流程:从下载到环境变量一次跑通
这里我以Windows 11系统、Temurin 17为例,一步一步走完整流程。Windows 10的操作方式几乎完全相同,可以放心照着做。
3.1 下载前先确认的硬件信息:64位系统和安装路径
第一步不是去下载,而是先搞清楚自己电脑的系统位数。右键点击“此电脑”选择“属性”,查看“系统类型”是64位还是32位。现在绝大多数电脑都是64位系统,如果你还在用32位系统,那我想说:这都什么年代了,赶紧重装个64位系统再学Java吧,2024年之后的JDK版本基本都只提供64位安装包了。
确认完毕之后,去Temurin的官网(也就是Eclipse Adoptium的网站)下载页面,在Version选项里选择17,Operating System选择Windows,Architecture选择x64,然后点击下载.msi格式的安装包。这里我建议选.msi格式,因为它的安装过程像普通软件一样有图形界面,比较适合新手,.zip免安装版反而容易因为解压路径混乱导致后续配置出错。
3.2 JDK安装包一步步装完:注意一个很容易被忽略的弹窗
下载完成后双击.mis安装包,安装过程有几个步骤需要留心:
- 欢迎界面直接Next。
- 选安装路径时,把默认路径改成一个没有空格和中文的目录,比如我先建好
C:\dev\java文件夹,然后把安装路径指到C:\dev\java\jdk-17。注意:安装路径最后会带jdk-17这样的版本文件夹,方便以后装多个版本时一眼认出。 - 关键一步:界面上会出现一个选项叫“Set JAVA_HOME variable”,意思是“是否自动帮我把JAVA_HOME环境变量配好”。这里一定要勾选上,然后它会让你选择安装到的本地JDK版本,选我们刚指定的那个目录就行。这个选项还会自动把
bin目录加进PATH,很多人不知道这个细节,手动配置时反而容易把路径写错。 - 再往下有一个“JavaSoft (Oracle) registry keys”之类的关联选项,保持默认即可。
- 点击Install,等待安装完成。
安装完之后,先不要急着关窗口,打开文件资源管理器确认一下C:\dev\java\jdk-17\bin目录下确实有java.exe和javac.exe这两个文件,这是后续验证的底气。
3.3 环境变量配置实操(Windows 10/11通用)
虽然安装时勾选了自动配置JAVA_HOME,但我还是建议你手动进去检查一遍,同时顺便把整个配置过程学会,因为你以后很可能要在别的电脑上不带图形安装包地配置环境。
右键“此电脑” -> “属性” -> “高级系统设置” -> 右下角的“环境变量”,会看到一个对话框,上半部分是用户变量,下半部分是系统变量。在“系统变量”区域点击“新建”,变量名填JAVA_HOME,变量值填C:\dev\java\jdk-17(这里填JDK安装的根目录,不要带\bin)。
然后在下方的“系统变量”列表里找到Path,双击它,在弹出的编辑界面里点击“新建”,输入%JAVA_HOME%\bin,然后把它上移到最顶部。点击确定保存。这里有两个容易踩的坑:一是很多人会直接把%JAVA_HOME%\bin输入成了一个错误格式,比如多了个分号或者少了反斜杠,要仔细核对;二是上移的作用是让它优先被搜索到,如果你电脑里之前装过其他Java版本,这一步能避免“明明配置了新版本,运行的却是旧版本”的问题。
3.4 命令行验证:不只看java -version,还要看javac
配置完环境变量,最关键的一步来了:验证。先打开一个全新的命令行窗口(开始菜单搜索“cmd”回车即可,注意一定是新开的窗口,旧窗口不会自动刷新环境变量读取结果),依次输入两条命令:
java -version javac -version正常情况下,java -version会输出类似openjdk version "17.0.x" ...的信息,javac -version会输出类似javac 17.0.x的信息。两条命令都有输出,才说明环境配置真正成功。
这里我想特别强调javac的重要性。java命令负责运行程序,javac命令负责编译程序,想要开发Java代码,两者缺一不可。如果java -version有输出但javac报“不是内部或外部命令”,说明你的PATH里指向的根本不是一个完整JDK,大概率是系统里残留的JRE在捣乱。这个问题我后面会专门展开讲。
顺便再验证一下JAVA_HOME是否生效,输入:
echo %JAVA_HOME%如果能输出C:\dev\java\jdk-17,说明环境变量链路已经完整打通。
4. macOS与Linux环境配置简述:跨平台的思路完全一致
虽然Windows用户占据了Java学习者的半壁江山,但macOS和Linux上的Java开发者数量其实也非常可观,而且这三个平台的配置思路是一模一样的,只是具体的操作命令不同。如果你用mac或Linux,这一节可以直接抄作业。
4.1 macOS上的安装方式和JAVA_HOME设置
macOS有两种主流安装方式:图形化拖拽安装和Homebrew命令行安装。
图形化方式很简单,下载Temurin 17的.pkg安装包,双击一路继续安装即可。装完之后打开“终端”,输入java -version和javac -version验证一下,正常情况下命令已经被自动加入到PATH里了,不需要手动改任何东西。macOS上JDK被统一安装在/Library/Java/JavaVirtualMachines/目录下,系统自带的命令/usr/libexec/java_home可以帮你准确找到当前使用的JDK路径,输入/usr/libexec/java_home回车,它会输出类似/Library/Java/JavaVirtualMachines/xxx.jdk/Contents/Home的结果,这个路径就是JAVA_HOME的值。
如果你更习惯用Homebrew管理软件,那安装方式更简单:
brew install openjdk@17但这里有个小坑:Homebrew安装的openjdk是“keg-only”的,意思是它不会被自动链接到系统PATH中,需要手动加一条软链接或者把路径写进环境变量。最稳妥的做法是在你的shell配置文件(比如~/.zshrc)里加上:
export JAVA_HOME=$(/usr/libexec/java_home -v 17) export PATH=$JAVA_HOME/bin:$PATH改完后执行source ~/.zshrc让它生效,再验证java -version和javac -version即可。
4.2 Linux通过包管理器安装JDK并配置全局环境变量
Linux发行版种类很多,我以最常见的Ubuntu/Debian系和CentOS/RHEL系为例来讲。Ubuntu系统使用apt包管理器,安装非常痛快:
sudo apt update sudo apt install openjdk-17-jdkCentOS/RHEL系统使用yum包管理器,对应的命令是:
sudo yum install java-17-openjdk-devel注意CentOS安装时包名一定要带-devel,因为不带devel的只是JRE运行环境,不包含javac编译器,这也是Linux上非常容易踩的一个坑。
安装完成后,用java -version和javac -version验证,如果都正常,再手动把JAVA_HOME写进全局环境变量。先执行update-alternatives --config java查看当前默认JDK路径,或者直接搜寻:
sudo update-alternatives --list java找到路径后,在/etc/profile.d/java.sh文件里写入:
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64 export PATH=$JAVA_HOME/bin:$PATH保存后执行source /etc/profile.d/java.sh,然后验证echo $JAVA_HOME和java -version,一切正常就说明Linux环境配置完成。
4.3 为什么跨平台的核心逻辑都一样:JAVA_HOME只是路径
我见过很多人今天用Windows配置一遍,明天用mac配置一遍,总觉得是两个完全不同的流程,其实抓住本质之后就豁然开朗了:不管什么操作系统,最终要做的事就三件——把JDK文件解压或安装到一个了明确的目录、把这个目录记录到JAVA_HOME变量里、把$JAVA_HOME/bin(Windows是%JAVA_HOME%\bin)加进PATH。仅此而已,剩下的全是不同系统在表述方式上的差异。
5. 用HelloWorld验证整套环境:从新建文件到跑通输出
环境配置成功只代表工具链通了,但工具链通了不代表你就能正确使用它。我强烈建议你在正式学Java语法之前,先亲手写一个HelloWorld并让它跑起来,这个过程会一次性暴露你脑子里对“编译”和“运行”的模糊认知。
5.1 手写第一个Java文件:文件名与类名的硬性规定
新建一个纯文本文件,文件名必须叫HelloWorld.java,注意大小写和大小写敏感。然后用记事本或任何纯文本编辑器打开它,写入下面这段代码:
public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, Java!"); } }这里有一个Java的硬性规定:如果一个大类被声明为public class,那么文件的名字必须和这个类名完全一致,包括大小写。也就是说,类名叫HelloWorld,文件就必须叫HelloWorld.java,不能叫helloworld.java,也不能叫Hello.java。编译器在遇到时却会直接报“类是公共的,应在名为HelloWorld.java的文件中声明”的错误。这是新手一开始最容易踩的坑。
另外一个细节是文件编码。Windows上的记事本默认保存为GBK编码,如果你写的代码里有中文注释,用javac默认编码编译时可能会报“编码GBK的不可映射字符”的错误。建议你在记事本里点击“另存为”,把编码选成UTF-8,再保存。我在自己电脑上写代码时从来不用记事本,后面讲到IDE时会解释原因,但新手阶段用记事本练一次手、踩一遍这个坑,反而是印象最深刻的学习方式。
5.2 javac编译和java运行,这两步到底发生了什么
打开命令行窗口,先切换到HelloWorld.java所在的目录,然后依次执行:
javac HelloWorld.java这一步是“编译”,它会把你的.java源代码翻译成JVM能识别的.class字节码文件。编译成功的话,你会发现当前目录下多了一个HelloWorld.class文件,而且命令行不会打印任何提示信息。注意:没有消息就是好消息,这是Unix哲学里的经典观念,很多新手以为控制台没反应是出错了,还非要去搜一遍“javac没输出正常吗”,这里我直接告诉你,没有报错就是成功了。
紧接着执行运行命令:
java HelloWorld这一步是“运行”,JVM会加载HelloWorld.class并执行其中的main方法。注意这里的类名不包含.class后缀,也不能写成java HelloWorld.class,很多新手死在这一步。如果一切正常,命令行会输出Hello, Java!。
为什么必须先编译再运行?打个比方,javac就像是把一篇中文文章翻译成英文,而java是拿着英文稿子去朗读。没有翻译稿(.class文件),后边的朗读者(JVM)根本不知道要念什么。
5.3 HelloWorld报错定位:我见过最多的三类新手错误
如果HelloWorld没有跑通,别慌,对照下面的场景自查:
javac: 不是内部或外部命令:说明JDK环境变量没配好,回去看第3.3节,大概率是%JAVA_HOME%\bin没写进PATH,或者路径写错了。错误: 找不到或无法加载主类:先确认是不是执行了java HelloWorld.class,然后确认当前目录下确实存在HelloWorld.class文件,最后再确认类名和文件名拼写完全一致。错误: 编码GBK的不可映射字符:代码里有非英文字符,而且保存的编码不是UTF-8。解决办法是重新用UTF-8编码保存文件,或者编译时加一句javac -encoding UTF-8 HelloWorld.java。
6. 装完环境还要装什么:IDE选型和IDEA首次配置
如果你已经通过命令行跑通了HelloWorld,那恭喜你,Java开发的大门已经打开了。但接下来的开发里,你真的要一直用记事本加命令行写代码吗?我劝你慎重,因为Java项目结构一复杂,纯命令行管理源文件能让人怀疑人生,这时候就需要IDE上场了。
6.1 IntelliJ IDEA Community为什么是新手首选
Java圈子里最常用的IDE无外乎三款:IntelliJ IDEA、Eclipse、VS Code。三款我都用过,但我给新手的建议非常明确:直接用IntelliJ IDEA Community版(社区版),它免费、无需破解、对Java的主流支持甚至超过很多商业版工具,也是目前世界范围内Java工程师使用率最高的IDE之一。
一句话总结Eclipse和IDEA的差别:Eclipse更像一个空白的工作平台,很多东西在你上手时是需要选插件的,配置起来比较折腾;IDEA则是把完善的命令和智能提示都准备好,开箱即用。名字的“IntelliJ”就来源于“intelligent”,它会在你写代码时预判你的下一步,补全效率明显更高。对新学者来说,一个好的IDE能极大降低“语法还没记牢”带来的挫败感,所以第一印象很重要,我不建议新手拿Eclipse磨炼意志。
6.2 IDEA里指定JDK版本的两种方式
下载并安装完IDEA Community之后,打开它,第一次会进入启动向导页面。这里有两种情况:
如果你是先装了JDK再装的IDEA,启动时它通常会自动检测到系统的JAVA_HOME并显示在首页的SDK列表里,直接选中即可。但如果你跟我一样遇到过检测失败的情况,或者系统里装了多个JDK,那就需要手动指定。在IDEA欢迎页点击“New Project”,在项目设置向导里找到“Project SDK”右侧的下拉框,选“Add JDK”或“Add SDK”,然后浏览到你前面安装的JDK根目录,比如Windows上的C:\dev\java\jdk-17,选中之后点击OK,IDEA就能识别出这个JDK,并把它的版本信息显示出来。这个是新建项目时的配置方式。
另一种方式是修改已有项目的SDK:菜单栏点击File -> Project Structure -> Project,在右侧的“SDK”栏里同样可以点击“Add JDK”添加,然后在“Language level”里选对应的语法级别。我这里要提到的经验是:Language level和SDK是两个概念,SDK决定用哪个JDK,Language level决定编译器接受哪些语法版本,最好保持一致,否则容易遇到“某些代码在项目里标红但编译却通过”或者“编译报错但代码看起来没问题”的怪象。
6.3 Eclipse和VS Code的取舍:什么情况下才建议选
既然我说IDEA是首选,那Eclipse和VS Code是不是完全没有存在的意义?也不是,分场景看。Eclipse有强大的插件生态,比如嵌入式开发、C/C++混合开发等场景下,Eclipse依然有不少忠实用户,另外一些老公司、老项目用了十几年的Eclipse,新人进去往往也得跟着用。VS Code则是一个轻量级的编辑器,装完“Extension Pack for Java”插件之后也可以写Java,启动速度快、占用资源低,写一些脚本工具、小样例项目很顺手,但如果做大型Spring Boot项目,各种微服务模块一多,VS Code在导航、重构、依赖分析方面的体验还是比IDEA差一截。
所以我的结论是:新手第一门语言的第一个IDE,不用犹豫,直接选IDEA Community;Eclipse可以等你日后碰到老旧项目时再补知识;VS Code更适合作为第二编辑器,用于快速浏览代码和写小测试,不建议作为主开发工具。
7. 环境配置常见问题排查:这些坑我都踩过,你直接抄答案
配置环境这件事,每个人多多少少都会碰到报错。下面这几类是过去几年里被问得最多的问题,我按出现频率排个序,每个都附上排查思路,哪怕你没遇到,也建议收藏备用。
7.1 明明配好了,cmd里就是提示“不是内部或外部命令”
这个场景几乎每个新手都经历过。第一反应别急着怀疑配错了,先确认你当前打开的cmd窗口是什么时候打开的。环境变量的读取发生在命令行窗口启动的那一刻,如果你先开了cmd,然后才去修改环境变量,这个窗口里读到的还是旧配置,所以你运行java时报“不是内部或外部命令”,但你打开“系统属性”看配置又明明是对的。
解决办法也很简单:关掉cmd窗口,重新开一个,再试。如果你不喜欢一遍遍开关,也可以在命令行里输入:
refreshenv不过这个命令需要额外装Chocolatey包管理器才会有,所以我一般还是建议直接关开窗口。另外再检查一个细节:你确认%JAVA_HOME%\bin里真的有java.exe和javac.exe吗?有时安装包没有完整解压,或者你路径填的是JDK根目录(比如C:\dev\java\jdk-17)而没有指向bin子目录,也会导致找不到命令。
7.2 java -version有输出、javac却没有,典型JRE残留
这是很多Windows老用户会踩的特殊坑:系统里可能残留着以前安装Java时自动装上的JRE,或者某个第三方软件悄悄往Path里塞了一条JRE路径。运行时只要找到java.exe就能用,所以java -version正常;但JRE里压根就没有javac.exe,所以javac怎么都找不到。
排查方法是先看JDK路径是否真的在PATH里,而且要在JRE路径前面。在cmd里输入where java,会按PATH顺序列出所有找到的java.exe及对应路径,接着输入where javac,看它是空还是有路径。如果你看到where java返回的第一个路径不是你的JDKbin目录,那就说明PATH里还有其他Java路径排在前面,去环境变量里把那些路径删掉,或者把你自己的%JAVA_HOME%\bin上移到最顶部,问题就能解决。
7.3 “错误: 找不到或无法加载主类”的三个真实原因
这个报错在HelloWorld阶段出现频率极高,但原因就三选一:一是运行时类名写错了,比如带了.class后缀,或者大小写和类名不一致;二是.class文件不在当前目录,而你运行java时又没有用-cp指定类路径,JVM默认只在当前目录找类,所以编译完不要乱移动.class文件;三是你写了package声明但运行命令里没带包名,比如代码第一行写了package com.demo;,那编译后的类就处于com.demo包下面,运行命令必须回到包路径的上一级目录,写完整类名com.demo.HelloWorld,否则JVM照样找不到。
第三种情况其实是“类名全限定名”的概念,新手一上来接触得少,容易在这里卡很久。你只需要记住:代码里写了package,运行时就得带上“包名加类名”。
7.4 系统里装了多个JDK,怎么快速切换
有些同学电脑里可能因为之前折腾,装过Java 8、Java 17两个甚至更多的JDK,导致java -version显示的版本不是你想要的。这种情况优先级是最容易判断的:PATH里所有路径按顺序从上到下检索,谁排在前面就用谁。如果你希望自己指定的版本生效,就在环境变量里把%JAVA_HOME%\bin或对应的C:\dev\java\jdk-17\bin手动移动到最上面。
如果你经常需要在不同项目间切换JDK版本,那比手工改Path更优雅的办法是利用IDE的SDK配置。IDEA每个项目都可以独立指定SDK,所以你在IDEA里完全不需要动系统环境变量,各项目用各项目的版本,互不干扰。这也是我推荐把“系统层面的PATH”和“项目层面的SDK”两个概念分开理解的原因,混在一起想就会觉得切换版本特别麻烦。
7.5 配置完要不要重启电脑:一个我说了很多遍的细节
先说结论:配置完JAVA_HOME和PATH,不需要重启电脑,只需要重新打开命令行窗口就够了。很多人严格按照教程配置完,发现还是不行,又跑去重启,其实大概率不是重启能解决的问题,而是像7.1和7.2里说的情况——没开新窗口或者Path路径顺序不对。
不过有一个例外场景:如果你装JDK之前已经开了好几个软件,比如某些老版本的IDE或服务器软件,它们不会自动感知新的环境变量,这种时候重启一下这些软件就好,不需要重启整个操作系统。另外,Windows Explorer(资源管理器)有时会缓存环境变量,导致你从资源管理器地址栏里打开cmd时读到旧配置,那就不如直接开始菜单搜“cmd”打开新窗口来得干净。
最后再说一点个人体会。我帮人排查环境问题,第一句话永远是:“把所有命令行窗口全部关掉,新开一个,再试一遍。”就这一条,几乎能解决三成以上“我明明配好了但就是不行”的问题。Java环境配置这件事,第一次折腾确实会觉得啰嗦,但只要你动手完整装过一遍,后边换新电脑、换操作系统、换工作环境,思路都是一模一样的。把JAVA_HOME、PATH、javac这个铁三角跑通了,你的Java学习之路才算真正迈开了第一步。