
1. 开工之前JDK和IDEA的版本选择是第一道坎搞Java开发环境搭建这一步绕不过去。我见过太多人代码还没写一行先卡在javac不是内部或外部命令上耗掉一整个下午。这篇内容就是把这套流程从头到尾捋一遍——IntelliJ IDEA 2023怎么装、JDK怎么配、环境变量为什么会失败、多版本怎么共存全部讲透。不管你是刚转行学Java的新人还是换了新电脑要重新搭环境的老手跟着走一遍就能跑起来。先说一个很多人忽略的前提JDK和IDEA的版本是有搭配关系的。IDEA 2023系列对JDK的支持范围比较宽从JDK 8一直到JDK 21都能识别但内置的编译器和语言级别支持是以较新版本为准的。如果你装的是JDK 8IDEA 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上用.zipmacOS和Linux用.tar.gz。2.3 Windows平台安装细节如果你选了.exe安装程序双击后一路下一步就行但有两个地方要改。第一个是安装路径。默认路径通常是C:\Program Files\Java\jdk-17里面有空格。空格本身不会让JDK跑不起来但后面某些构建工具、脚本处理路径时可能出问题。我的习惯是改成C:\dev\jdk-17这种没有空格、层级浅的路径。第二个是是否安装JRE。安装向导会问你要不要同时装公共JREJDK 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_HOMEPATH不用动。顺序上有个讲究%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下是.exemacOS下分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。写代码时不用手动敲importIDEA自动帮你补。关闭拼写检查。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 ProjectName填项目名比如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可以选BundledIDEA自带的或者你本地下载的。本地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.batecho 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项目用8B项目用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 foundecho %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没有就退出。这个教训让我养成了习惯装完JDKJAVA_HOME和PATH两个都配缺一不可。第三个坑IDEA的缓存导致改了配置不生效。有次改了项目SDK版本编译还是报旧版本的错。试了各种办法都不行最后File→Invalidate Caches→Invalidate and Restart重启后一切正常。IDEA的索引和缓存机制很强大但偶尔会“过于聪明”把旧配置缓存住了。遇到配置改了不生效的诡异问题先清缓存重启能省下大量排查时间。第四个坑命令行和IDEA用的不是同一个JDK。我在终端里java -version显示17但IDEA运行项目时Message窗口显示用的是21。原因是系统里装了21Path里排在了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项目能编译能运行这套流程走下来环境基本就稳了。后面再遇到问题大概率是项目依赖和构建工具层面的跟基础环境无关。环境搭建这事一次配好能用很久值得花时间做扎实。