1. 开工之前:JDK和IDEA的版本选择是第一道坎
搞Java开发,环境搭建这一步绕不过去。我见过太多人,代码还没写一行,先卡在javac不是内部或外部命令上耗掉一整个下午。这篇内容就是把这套流程从头到尾捋一遍——IntelliJ IDEA 2023怎么装、JDK怎么配、环境变量为什么会失败、多版本怎么共存,全部讲透。不管你是刚转行学Java的新人,还是换了新电脑要重新搭环境的老手,跟着走一遍就能跑起来。
先说一个很多人忽略的前提:JDK和IDEA的版本是有搭配关系的。IDEA 2023系列对JDK的支持范围比较宽,从JDK 8一直到JDK 21都能识别,但内置的编译器和语言级别支持是以较新版本为准的。如果你装的是JDK 8,IDEA 2023里有些新特性提示会显示不出来;反过来,如果你用JDK 21,但项目里引用的某些老框架只兼容JDK 8,编译时就会报Unsupported class file major version。
我个人的建议很明确:新项目直接上JDK 17。理由有三个。第一,JDK 17是长期支持版本(LTS),官方维护周期长,企业里用得最多。第二,主流框架如Spring Boot 3.x已经强制要求JDK 17起步,你早晚要升。第三,IDEA 2023对JDK 17的适配最成熟,各种语法高亮、调试功能都跑得最顺。
至于IDEA 2023,它有小版本迭代,比如2023.1、2023.2、2023.3。这几个版本核心功能差别不大,但2023.3对Java 21的虚拟线程调试支持更好。如果你不确定选哪个,装2023.3就行,兼容性和稳定性都经过了大批量用户的验证。社区版(Community)免费,够日常学习和大多数后端开发用;终极版(Ultimate)收费,多了Spring、数据库工具、前端框架支持。学生和开源项目作者可以申请免费授权,这个渠道官方一直有。
还有一个容易被忽视的点:先装JDK,再装IDEA。顺序反了不会报错,但IDEA首次启动时会扫描不到JDK,你得手动去配,多一道手续。按顺序来,IDEA启动后能自动识别到已安装的JDK,省事。
2. JDK下载与安装:官网、镜像、包管理器三条路
2.1 官网下载的正确入口与版本辨认
JDK的官方下载入口在Oracle官网,但很多人第一次进去会懵——页面上摆着好几个版本,名字还都差不多。你要找的是Java SE Development Kit,不是JRE(运行环境),也不是Server JRE。JDK包含了编译器和调试工具,是做开发必须的那个。
具体路径:进Oracle官网,找到Downloads菜单,选Java SE,然后往下翻到Java SE Development Kit 17的下载区。这里注意,Oracle从JDK 17开始,把免费授权和商业授权分开了。个人学习、开发测试用免费,商用大规模部署需要注意授权条款。这个细节很多人不知道,公司里用的时候要留个心。
官网下载的另一个问题是速度。国内直连Oracle的下载服务器,速度经常只有几十KB每秒,一个180MB左右的安装包能下半小时。这时候可以用镜像站。
2.2 国内镜像下载方案
国内几个高校和企业维护的镜像站都提供JDK的下载。常用的有清华镜像、华为云镜像、阿里云镜像。以清华镜像为例,路径大致是mirrors.tuna.tsinghua.edu.cn下面找Adoptium或者OpenJDK的目录。
这里要区分两个概念:Oracle JDK和OpenJDK。功能上,从JDK 17开始两者代码基本一致,Oracle JDK多了一些商业特性(比如某些监控工具),日常开发用OpenJDK完全够。Adoptium(原AdoptOpenJDK)提供的构建版本质量很稳,社区维护活跃,我个人更推荐用它。
镜像站下载还有个好处:可以直接下压缩包(.zip或.tar.gz)而不是安装程序(.exe或.msi)。压缩包解压就能用,不用走安装向导,后面配环境变量的时候路径也更干净,不会有空格和特殊字符。Windows上用.zip,macOS和Linux用.tar.gz。
2.3 Windows平台安装细节
如果你选了.exe安装程序,双击后一路下一步就行,但有两个地方要改。
第一个是安装路径。默认路径通常是C:\Program Files\Java\jdk-17,里面有空格。空格本身不会让JDK跑不起来,但后面某些构建工具、脚本处理路径时可能出问题。我的习惯是改成C:\dev\jdk-17这种没有空格、层级浅的路径。
第二个是是否安装JRE。安装向导会问你要不要同时装公共JRE,JDK 17之后这个选项其实可以取消。JDK自带完整的运行环境,再装一个JRE反而会让环境变量指向混乱。取消勾选,只装JDK。
如果你用的是.zip压缩包,解压到C:\dev\jdk-17就行,不用运行任何安装程序。这也是我推荐的方式,干净利落,卸载的时候直接删文件夹,不留注册表垃圾。
2.4 macOS与Linux的安装差异
macOS上,如果你用.dmg安装包,它会装到/Library/Java/JavaVirtualMachines/目录下。这个路径是macOS系统级Java的约定位置,IDEA和系统命令都能自动找到。用.tar.gz的话,解压后需要自己配置JAVA_HOME。
Linux上基本都用.tar.gz。解压到/usr/local/jdk-17或者/opt/jdk-17,然后编辑/etc/profile或者用户目录下的.bashrc。这里有个细节:修改/etc/profile影响所有用户,修改.bashrc只影响当前用户。开发机上建议改.bashrc,避免误操作影响系统其他服务。
# Linux下配置JDK环境变量的典型写法 export JAVA_HOME=/usr/local/jdk-17 export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar改完记得source ~/.bashrc让配置生效。这一步经常被忘,改完文件不source,然后在新终端里测还是旧版本。
提示:CLASSPATH在JDK 9之后其实已经不是必须配的了,默认值就够用。但很多老教程还在教,配了也不会出错,只是要注意别把已有的CLASSPATH覆盖掉。
3. 环境变量配置:90%的人卡在这里
3.1 JAVA_HOME到底为什么必须设
很多人问:不配JAVA_HOME,直接把JDK的bin目录加到PATH里,java和javac命令也能用,为什么还要多配一个JAVA_HOME?
原因是:大量工具和框架是靠JAVA_HOME来定位JDK的,而不是靠PATH。比如Maven的启动脚本、Tomcat的catalina.sh、Gradle的构建脚本,第一步都是读JAVA_HOME。如果你只配了PATH,这些工具就找不到JDK,会报JAVA_HOME is not defined correctly。
IDEA虽然可以在设置里手动指定JDK路径,但它的终端、Maven集成、Gradle集成都会去读系统环境变量。所以JAVA_HOME是必配项,不是可选项。
3.2 Windows环境变量配置的完整步骤
Windows下配置分两步:新建JAVA_HOME,然后把它加到PATH。
第一步,右键“此电脑” → 属性 → 高级系统设置 → 环境变量。在“系统变量”区域(不是上面的“用户变量”),点“新建”。变量名填JAVA_HOME,变量值填JDK的安装根目录,比如C:\dev\jdk-17。注意:只填到jdk-17这一层,不要填到bin目录。很多人在这里填成C:\dev\jdk-17\bin,结果后面全乱套。
第二步,找到系统变量里的Path,双击编辑,新建一行,填%JAVA_HOME%\bin。用%JAVA_HOME%引用而不是写死路径,好处是以后换JDK版本只需要改JAVA_HOME,PATH不用动。
顺序上有个讲究:%JAVA_HOME%\bin最好放在Path列表的靠前位置。如果系统里之前装过其他Java版本,它们的bin目录可能还在Path里,位置靠前的话会覆盖掉新配的。把新的往上移,确保优先命中。
3.3 配置失败的六种典型情况排查
配完环境变量,一定要新开一个命令行窗口再测,旧窗口读的是旧环境变量。然后执行:
java -version javac -version echo %JAVA_HOME%java -version输出的是运行时版本,javac -version输出的是编译器版本,两个都要看。如果java有输出但javac报“不是内部或外部命令”,说明PATH里配的是JRE而不是JDK,检查JAVA_HOME是不是指到了jre目录。
下面这张表是我这些年帮人排查时总结的高频问题:
| 现象 | 根本原因 | 解决方向 |
|---|---|---|
javac不是内部命令 | PATH里没加bin,或加的是JRE的bin | 检查JAVA_HOME指向JDK根目录 |
java -version输出旧版本 | Path里有其他Java路径且位置更靠前 | 把%JAVA_HOME%\bin移到最前 |
| JAVA_HOME值末尾多了分号 | 手动输入时习惯性加了分号 | 去掉末尾分号 |
| 路径含中文或空格 | 安装到了默认的Program Files或中文目录 | 换到C:\dev\jdk-17 |
命令行里%JAVA_HOME%不展开 | 在用户变量里配了但系统变量没配 | 统一配在系统变量里 |
| 改完没生效 | 没重开命令行窗口 | 关掉所有cmd重开 |
还有一个坑:Windows的Path编辑界面是分行显示的,但底层还是一个分号分隔的长字符串。有些老版本的编辑器在粘贴时会把分号吞掉,导致两条路径连在一起。编辑完点确定,再重新打开看一眼,确认分行显示正常。
3.4 macOS和Linux的验证方式
macOS和Linux下用echo $JAVA_HOME和which java来验证。which java应该输出$JAVA_HOME/bin/java,如果输出的是/usr/bin/java,说明系统自带的Java抢先了,需要在PATH里把$JAVA_HOME/bin放到前面。
macOS有个/usr/libexec/java_home工具,执行/usr/libexec/java_home -V可以列出系统里所有已安装的JDK,这个在做多版本切换时很有用。
Linux下如果用了update-alternatives管理Java版本,还需要执行update-alternatives --config java来切换。这个机制和手动配PATH是两套体系,搞清楚你的系统用的是哪种,别两边都配然后互相打架。
4. IntelliJ IDEA 2023安装与初始配置
4.1 安装包选择与安装流程
IDEA 2023的安装包从官网下载,页面会自动识别你的操作系统推荐对应版本。Windows下是.exe,macOS下分Intel芯片和Apple Silicon芯片两个版本——M系列芯片的Mac一定要下aarch64版本,下成x64的虽然能通过转译运行,但启动慢、内存占用高。
安装过程中有个选项叫“Add launchers dir to the PATH”,建议勾上。这样在终端里可以直接用idea .命令打开当前目录为项目,效率提升明显。另一个选项“Create Desktop Shortcut”按需勾选。
安装路径同样建议避开中文和空格。默认路径在C:\Program Files\JetBrains\下面,有空格但IDEA自己处理得了,问题不大。如果你有洁癖,改到C:\dev\idea也行。
macOS下把下载的.dmg打开,把IDEA图标拖到Applications文件夹就完成了。首次打开时系统会提示“来自互联网的应用”,点确认即可。
4.2 首次启动必须改的几个设置
IDEA首次启动会问你要不要导入之前的设置,新装的话选“Do not import settings”。然后会让你选主题,这个看个人喜好,深色主题(Darcula)写代码久了眼睛舒服些。
接下来几项设置我建议一进去就改:
内存分配。IDEA默认的最大堆内存可能只有750MB,开两个项目就卡。在Help→Change Memory Settings里改成2048MB或更高。你的机器如果有16GB内存,给IDEA分4GB完全没问题。
编码格式。File→Settings→Editor→File Encodings,把Global Encoding和Project Encoding都设成UTF-8。这个不设置的话,中文注释和字符串在有些情况下会乱码。
自动导包。Settings→Editor→General→Auto Import,勾上Add unambiguous imports on the fly和Optimize imports on the fly。写代码时不用手动敲import,IDEA自动帮你补。
关闭拼写检查。Settings→Editor→Inspections→Proofreading,把拼写检查关掉。不然你的变量名、方法名下面全是波浪线,看着心烦。
4.3 IDEA中配置JDK的两种路径
IDEA里配置JDK分两个层级,很多人搞混:项目级SDK和平台级SDK。
平台级SDK在File→Project Structure→Platform Settings→SDKs里配置。这里配好的JDK,所有项目都能选用。点加号,选JDK,然后浏览到你JDK的安装根目录,IDEA会自动识别版本号和内部结构。
项目级SDK在Project Structure→Project Settings→Project里配置。这里指定当前项目用哪个SDK,以及编译的Language Level。Language Level决定了IDEA用哪个Java版本的语法来检查你的代码。如果你用JDK 17,但Language Level设成了8,那Java 9之后的新语法(比如var、文本块)会报错。
两者的关系:项目级SDK是从平台级SDK列表里选的。所以顺序是先配平台级,再在项目里选。如果你只配了项目级,换项目又要重配一遍。
如果IDEA启动时没自动识别到JDK,多半是JAVA_HOME没配好,或者你装的是压缩版JDK没有注册到系统。这时候在SDKs里手动添加路径也能用,但系统终端里Maven、Gradle还是找不到,所以根源还是要回到环境变量。
5. 第一个项目:从创建到跑通
5.1 创建项目的参数选择
File→New→Project。左侧选New Project,Name填项目名,比如hello-java。Location选一个没有中文的路径。Build system选IntelliJ(新版本里叫IntelliJ IDEA原生构建),初学者不用一上来就选Maven或Gradle,减少变量。
JDK那一栏,如果前面配好了,下拉框里会直接列出可用的JDK。选JDK 17。Add sample code可以勾上,IDEA会自动生成一个带main方法的类,方便你直接运行测试。
点Create,项目就建好了。目录结构大概是:
hello-java/ ├── .idea/ # IDEA的项目配置,不用手动改 ├── src/ # 源代码目录 │ └── Main.java └── hello-java.iml # 模块配置文件.idea目录是IDEA自己维护的,建议加到.gitignore里,不要提交到版本库。团队协作时每个人的本地配置不同,提交上去只会造成冲突。
5.2 编译运行与输出路径确认
点击Main.java里的绿色三角,选Run。第一次运行,IDEA会先编译再执行,底部的Run窗口会输出结果。如果看到Process finished with exit code 0,说明一切正常,环境通了。
如果报错,常见的有两类。第一类是Cannot find JDK,回到Project Structure检查SDK配置。第二类是编译输出目录有问题,在Project Structure→Project→Compiler output里,默认是项目下的out目录。如果这个路径被改了或者指向了不存在的盘符,编译会失败。
编译产物在out/production/hello-java/下面,可以看到.class文件。你可以用javap -c反编译看一下字节码,验证编译确实发生了。这个习惯在排查“代码改了但运行结果没变”的问题时特别有用——多半是编译没触发或者跑的是旧class。
5.3 在IDEA里配置Maven和Gradle
虽然第一个项目用原生构建就够了,但实际开发迟早要用Maven或Gradle。IDEA 2023自带捆绑的Maven和Gradle,但版本可能不是你项目需要的。
Maven配置在Settings→Build, Execution, Deployment→Build Tools→Maven。Maven home path可以选Bundled(IDEA自带的)或者你本地下载的。本地Maven的优势是可以在settings.xml里配国内镜像仓库,下载依赖速度快很多。阿里云的Maven镜像地址是https://maven.aliyun.com/repository/public,配到mirrors节点里。
Gradle类似,在Build Tools→Gradle里配置。Gradle的gradle-wrapper.properties里可以改distributionUrl指向国内镜像。
有一点要注意:IDEA里的Maven配置和命令行的Maven配置是两套。你在终端里mvn -v看到的是命令行Maven的版本,IDEA里用的是它自己配置的那个。两边版本差太多时,构建结果可能不一致。
6. 多JDK共存与降级到17的实操
6.1 为什么需要多个JDK版本
真实开发场景里,你手上往往不止一个项目。老项目跑在JDK 8上,新项目用JDK 17,偶尔还要验证一下JDK 21的兼容性。在一台机器上装多个JDK是常态,关键是怎么管理。
Windows下多版本管理的思路是:每个版本装到独立目录,比如C:\dev\jdk-8、C:\dev\jdk-17、C:\dev\jdk-21。然后通过切换JAVA_HOME的值来切换默认版本。可以写几个批处理脚本,比如use-jdk17.bat:
@echo off setx JAVA_HOME "C:\dev\jdk-17" /M setx PATH "%JAVA_HOME%\bin;%PATH%" /M echo JDK switched to 17注意setx设置的变量在新窗口才生效,当前窗口要手动set JAVA_HOME=...。
6.2 降级到JDK 17时容易踩的坑
从高版本降级到17,最常见的报错是Unsupported class file major version 61。这个数字61对应JDK 17。如果你用JDK 21编译,类文件版本是65,拿到JDK 17上跑就会报这个错。
解决方向有两个:一是用javac --release 17编译,让编译器按17的规范生成类文件;二是在IDEA里把Project Structure→Project→SDK和Language Level都改成17,然后Build→Rebuild Project重新编译。增量编译可能不会重新生成所有class,改完版本后一定要Rebuild。
还有一个坑:Maven的pom.xml里可以配maven.compiler.source和maven.compiler.target。如果这两个值和IDEA里配的JDK版本不一致,编译出来的类文件版本可能不是你想要的。三个地方要统一:JAVA_HOME、IDEA项目SDK、Maven编译插件配置。
6.3 用IDEA管理多SDK的推荐做法
在IDEA的SDKs列表里把所有JDK版本都加进去,每个项目在Project Structure里选自己需要的那个。IDEA会按项目隔离,A项目用8,B项目用17,互不影响。
但有一点:IDEA的终端(Terminal)用的是系统环境变量里的JDK,不是项目SDK。所以你在IDEA终端里执行java -version,看到的可能是系统默认版本,而不是项目版本。要验证项目实际用的版本,看Run窗口第一行的输出,或者执行mvn -v(如果配了Maven的话,Maven会读取项目配置)。
注意:切换JDK版本后,
Settings→Build, Execution, Deployment→Compiler→Java Compiler里的Target bytecode version也要对应改。这个值和项目SDK不一致时,IDEA会给出警告但依然能编译,容易埋雷。
7. 常见问题速查与我的踩坑记录
7.1 高频问题速查表
| 问题 | 排查第一步 | 常见根因 |
|---|---|---|
| IDEA启动报No JDK found | echo %JAVA_HOME% | JAVA_HOME未配或值写错 |
终端java可用但Maven报错 | 检查Maven的JAVA_HOME读取 | Maven用了另一套环境变量 |
| 编译报“找不到符号” | 检查依赖是否下载完整 | Maven/Gradle仓库未同步 |
| 中文输出乱码 | 检查File Encodings | 编码未统一为UTF-8 |
| 项目能编译但运行报错 | 看Run窗口的classpath | 依赖范围(scope)配错 |
| IDEA卡顿 | 看右下角内存占用 | 堆内存分配太小 |
| 换JDK后编译报版本错 | javac -version对照 | 没Rebuild,跑的是旧class |
| 命令行编译正常,IDEA报错 | 对比两边JDK版本 | 项目SDK与系统JDK不一致 |
7.2 几个我亲身踩过的坑
第一个坑:安装路径带空格引发的连锁反应。早期我把JDK装在C:\Program Files\Java\jdk-17,配环境变量时用引号包了一下JAVA_HOME的值,结果某些脚本读取时把引号也当成了路径的一部分。后来统一改成C:\dev\jdk-17,再没出过这类问题。路径短、无空格、无中文,是环境搭建的第一原则。
第二个坑:以为配了PATH就不用配JAVA_HOME。有次帮同事看问题,他java -version正常,但Maven死活报JAVA_HOME not found。查了半天才发现他只配了PATH没配JAVA_HOME。Maven的启动脚本第一行就是读JAVA_HOME,没有就退出。这个教训让我养成了习惯:装完JDK,JAVA_HOME和PATH两个都配,缺一不可。
第三个坑:IDEA的缓存导致改了配置不生效。有次改了项目SDK版本,编译还是报旧版本的错。试了各种办法都不行,最后File→Invalidate Caches→Invalidate and Restart,重启后一切正常。IDEA的索引和缓存机制很强大,但偶尔会“过于聪明”,把旧配置缓存住了。遇到配置改了不生效的诡异问题,先清缓存重启,能省下大量排查时间。
第四个坑:命令行和IDEA用的不是同一个JDK。我在终端里java -version显示17,但IDEA运行项目时Message窗口显示用的是21。原因是系统里装了21,Path里排在了17前面,IDEA启动时读到了21。后来把Path顺序调了一下才统一。验证环境时,一定要在命令行和IDEA里分别确认版本,不能只看一处。
7.3 给新人的环境搭建清单
最后整理一份检查清单,装完环境后逐条过一遍:
java -version和javac -version都输出目标版本echo %JAVA_HOME%指向JDK根目录,不是bin目录PATH里%JAVA_HOME%\bin排在其它Java路径之前- IDEA的
SDKs列表里有目标JDK - 项目
Project Structure里SDK和Language Level一致 File Encodings全部设为UTF-8- 内存分配至少2048MB
- 新建一个Hello World项目,能编译能运行
这套流程走下来,环境基本就稳了。后面再遇到问题,大概率是项目依赖和构建工具层面的,跟基础环境无关。环境搭建这事,一次配好能用很久,值得花时间做扎实。