1. 先把工具链和版本这件事定下来
很多人第一次接触 IntelliJ IDEA,是被"最聪明的 Java 集成开发环境"这句话吸引过来的,实际打开之后发现光是建个项目就卡住了:菜单看不懂、SDK 不知道填什么、建完目录里空空荡荡没有 src。我自己当年也是这么过来的,新建项目这个动作看起来只有三步,但每一步背后都藏着一个需要理解的概念。这篇内容就是把这套流程从头到尾拆开讲清楚,包括工具选型的取舍、新建项目向导里每个选项的含义、src 目录为什么有时不出现、第一个类怎么敲、怎么跑起来、跑不起来怎么查。适合完全没碰过 IDEA 的初学者,也适合装了软件但一直没跑通第一个程序的人。
1.1 社区版和旗舰版的选型逻辑
IDEA 有两个主要发行版本,一个是免费的 Community Edition,一个是收费的 Ultimate Edition。新手最常问的就是"我该装哪个"。判断标准其实很简单:你现阶段写不写 Web 后端和企业级框架。
社区版覆盖了纯 Java SE 开发需要的全部能力,包括代码补全、重构、调试器、单元测试、Maven 和 Gradle 基础支持。旗舰版额外支持 Spring 全家桶、Java EE、数据库工具、前端框架、远程部署这些企业开发里高频使用的东西。如果你现在的目标是"把第一个 Java 程序跑起来"、"刷算法题"、"学 Java 基础语法",社区版完全够用,而且它是免费开源的,用起来没有任何心理负担。
我个人的建议是分阶段处理。学习基础语法阶段就用社区版,功能边界清晰,界面干净,不会有一堆你用不到的按钮干扰视线。等到真的开始做 Web 项目、需要 Spring Boot 的配置提示和数据库连接工具的时候,再考虑升级。学生和教师可以走官方的教育授权申请流程,这是官方明确提供的正规渠道,别去折腾那些来源不明的第三方方案,装了一堆东西不说,还可能把开发环境搞坏,得不偿失。
1.2 JDK 的准备与版本选择
IDEA 本身只是编辑器加工具链,它自己不包含 Java 运行环境。你得先装 JDK,IDEA 才能编译和运行你的代码。这件事必须先做,顺序不能反。
JDK 版本怎么选,我给一个直接可用的结论:优先选 LTS 长期支持版本。目前主流可选的是 8、11、17、21 这几个。8 是最老的,很多老项目还在用,但语法特性少;17 和 21 是近几年的主力,语法现代、生态完整,新项目基本都往这两个靠。如果你没有任何历史包袱,直接从 17 或 21 起步,学到的语法特性能跟得上现在的招聘要求。
安装路径建议不要放在带空格或中文的目录里,比如C:\Program Files\Java\jdk-17这种带空格的路径,虽然现在大部分工具都能处理,但在某些构建脚本里仍然是踩坑高发区。我会习惯性装到D:\dev\jdk17这种干净路径下。
环境变量这块,JAVA_HOME 指向 JDK 根目录,Path 里加上%JAVA_HOME%\bin。配置完之后开个新的命令行窗口,敲java -version和javac -version,两条命令都能正常输出且版本号一致,说明装好了。注意一定要开新窗口,旧窗口读的是缓存的环境变量,改了也不生效,这个细节每年都有人栽。
注意:JDK 安装目录和 IDEA 里配置的 SDK 路径必须指向同一个目录。有的机器上装了好几个版本的 JDK,搞混之后会出现"命令行里能编译,IDEA 里报错"这种诡异现象。
2. 新建项目:向导里每个选项都在决定什么
装好 IDEA 和 JDK,接下来就是新建项目。这一步是整个流程里信息密度最高的地方,因为向导里的每个下拉框都对应着一个真实存在的概念。我见过太多人在这里闭着眼睛一路 Next,然后面对一个跑不起来的项目完全不知道问题出在哪。
2.1 打开新建项目向导的正确入口
启动 IDEA,欢迎界面会有 "New Project" 按钮;如果已经打开了某个项目,入口在顶部菜单 File → New → Project。两个入口指向的是同一个向导,功能没有区别。
向导打开后,左侧会列出项目类型:Java、Kotlin、Spring、Maven、Gradle、Empty Project 等等。对于第一个程序,直接选最上面的 Java 就行。这里的选项决定了 IDEA 帮你预置哪些配置文件,选错了后面要手工补,比较麻烦。
右侧的字段逐个拆解:
Name是项目名称。不要用中文,不要用空格,习惯上用小驼峰或者短横线连接,比如hello-java、firstDemo。项目名会直接变成磁盘上的文件夹名字,中文名在某些构建工具和命令行场景里会出问题。
Location是项目存放路径。同样避开中文路径和带空格的路径。我会专门建一个D:\workspace目录来放所有练习项目,好处是以后备份、清理都方便,也不用担心系统盘被项目文件堆满。
Language保持 Java。Build system有三个可选:IntelliJ、Maven、Gradle。这里是最容易踩坑的地方。选 IntelliJ 表示使用 IDEA 自带的原生构建方式,不生成任何额外的配置文件,适合写小练习和单文件程序;选 Maven 或 Gradle 会自动生成pom.xml或build.gradle,适合需要引入第三方库的项目。第一个程序建议选 IntelliJ,理由是最少的干扰因素,能把"新建项目"这件事本身看清楚。
JDK下拉框要指向你刚装好的那个 JDK。如果下拉是空的,点 "Add SDK" → "Download JDK" 可以走官方下载,或者点 "Add SDK" → 手动指定本地 JDK 目录。这里显示的是 SDK 名称加版本号,确认版本和你装的一致。
2.2 深入 Advanced Settings 里的两个关键设置
新版 IDEA 的向导里有 "Add sample code" 复选框和 "Advanced Settings" 折叠区,这两个地方直接决定了项目建完之后目录里有没有东西。
"Add sample code" 勾上之后,IDEA 会自动帮你生成一个Main.java,里面带着 main 方法。对第一次上手的人来说,勾上它能立刻看到一个能跑的完整例子,省去很多困惑。但我的建议是第一遍先勾上跑通,第二遍再取消勾选自己从头敲。这样你能同时获得"成功的正反馈"和"手工创建文件的完整经验",两个都得有。
"Advanced Settings" 展开后有这么几项:
| 设置项 | 含义 | 建议值 |
|---|---|---|
| Module name | 模块名 | 默认跟项目名一致即可 |
| Base package | 基础包名 | 空着或填域名倒序 |
| Add sample code | 生成示例代码 | 第一遍勾选 |
| Create Git repository | 初始化 Git 仓库 | 学习阶段可以不勾 |
Base package这一项很多人直接跳过,导致后面所有类都堆在默认包里。Java 的规范是包名用域名倒序,全小写,比如公司域名是example.com,包名就是com.example。你如果只是练手,没有域名,用com.demo或者干脆留空都行。但要知道,默认包(default package)里的类是不能被其他包引用的,这是 Java 语言层面的限制,不是 IDEA 的问题。养成分包习惯,从第一个类开始。
2.3 项目建好之后,src 目录去哪了
这是新手提问率最高的问题:"新建项目之后没有 src 目录"。
先解释 src 是什么。src 是 source 的缩写,叫源码根目录,是 IDEA 用来标记"这个文件夹里的东西是需要被编译的 Java 源码"的地方。它不是 Java 语言规定的,而是 IDEA 的项目模型概念。IDEA 里有个东西叫 Sources Root,被标记为 Sources Root 的文件夹会显示成蓝色,编译器才会去里面找.java文件。
那为什么有时候看不到 src?常见原因有这几个:
第一种,你在向导里选的是 Empty Project。空项目只给你创建一个目录容器,什么都不生成,自然没有 src。解决方式是在项目根目录上右键 → New → Directory,输入src,然后再右键src→ Mark Directory as → Sources Root,图标变蓝就对了。
第二种,构建系统选了 Maven 或 Gradle,但项目还没完成索引或同步。Maven 项目的标准结构是src/main/java和src/test/java,比纯 Java 项目多两层目录。如果只看到src下面是main,别慌,继续展开,java目录在里面。有时候 IDEA 右下角会弹一个 "Load Maven Project" 的提示,点一下让它同步完,目录结构才会正确显示。
第三种,文件被折叠了。IDEA 的项目视图有个 "Compact Middle Packages" 选项,会把com.demo这种包名折叠成一行显示。这会让目录树看起来比实际少一层,容易误判。如果觉得别扭,点项目视图右上角的齿轮图标,取消勾选 "Compact Middle Packages"。
提示:判断一个目录是不是源码根目录,看颜色就行。蓝色是 Sources Root,绿色是 Test Sources Root,灰色是普通目录。颜色不对,编译器就找不到你的文件。
3. 写第一个类:从创建文件到敲完 main 方法
项目结构理清楚之后,就可以写代码了。这一步的目标很明确:创建一个符合 Java 语法规范的主类,让它能编译、能运行、能输出一行文字。
3.1 包、类、文件的命名关系
先厘清三者的关系,这是 Java 里最基础也最容易被忽略的规则。
包(package)是命名空间,用来避免类名冲突,同时对应磁盘上的目录层级。com.demo这个包,在磁盘上就是com/demo/两级目录。
类(class)是代码的组织单位,一个.java文件里可以写多个类。
文件名必须和文件里的public类名完全一致,包括大小写。public class HelloWorld必须写在HelloWorld.java文件里。如果文件名是helloworld.java,编译直接报错。
具体操作:在蓝色的src目录上右键 → New → Package,输入包名com.demo。然后在com.demo这个包上右键 → New → Java Class,输入HelloWorld,回车。注意新建对话框里有个选项是 "Class"、"Interface"、"Enum"、"Record",默认就是 Class,不用改。
IDEA 会自动在新文件第一行生成package com.demo;这句声明。这句话的作用是告诉编译器"我属于哪个包",不要手动删掉,删了之后 IDEA 会标红,编译也会出问题。
3.2 main 方法和输出语句的输入技巧
一个能被直接运行的 Java 类,必须有一个特定签名的入口方法:
public static void main(String[] args) { System.out.println("Hello, Java!"); }这个签名里的每个部分都有实际含义,不是死记硬背的咒语。public表示这个方法对外可见,Java 虚拟机要从外部调用它,不可见就调不到;static表示它是类级别的方法,不需要先创建对象就能调用,虚拟机启动时还没对象可创建;void表示没有返回值;String[] args是命令行参数的接收容器,虽然现在用不到,但签名不能少。
手敲这一大段确实烦,IDEA 提供了几个缩写模板:
- 在类体里输入
psvm,按 Tab 或回车,自动展开成完整的 main 方法签名 - 输入
sout,按 Tab,自动展开成System.out.println(); - 输入
fori,展开成 for 循环 - 输入
.var,在变量后面输入,自动补全变量声明
这几个缩写的展开效果可以在 Settings → Editor → Live Templates 里查看和自定义。我个人的习惯是psvm和sout两个必用,fori看情况,其他用得少。
写完之后整段代码应该是这样:
package com.demo; public class HelloWorld { public static void main(String[] args) { System.out.println("Hello, Java!"); } }IDE 右边界会有一条竖线提示行宽,一般默认 120 字符。代码超长了实际也不影响编译,但保持适当的换行习惯对后续阅读有好处。
3.3 编译和运行的差别,别混为一谈
这里要插一个概念,因为很多报错都源于把这两件事搞混。
编译是把.java源文件翻译成.class字节码文件的过程,由javac完成。编译期能发现的错误叫编译错误,比如少写分号、类型不匹配、类名和文件名不一致。
运行是让 Java 虚拟机加载.class文件并执行 main 方法的过程,由java命令完成。运行期才会暴露的错误叫运行时异常,比如数组越界、空指针。
IDEA 在点击运行按钮时,会先自动触发一次编译,编译成功才执行。所以你看到报错时,第一件事是判断这个错是在哪个阶段发生的。IDEA 底部有个 Build 工具窗口,编译的输出信息都在里面;运行时的输出在 Run 窗口里。两个窗口分开看,定位问题的速度会快很多。
4. 运行起来:运行配置和输出结果
代码写完了,点绿色三角就能跑。但按钮背后发生了什么,值得搞清楚,因为一旦跑不起来,排查思路全在这里。
4.1 Run Configuration 是什么
IDEA 每次运行一个类,都会为它创建一份运行配置(Run Configuration)。这份配置记录了几件事:运行哪个类、用哪个 JDK、工作目录在哪、虚拟机参数是什么、传入什么命令行参数。
创建方式有三种:点击 main 方法左边行号栏的绿色三角,会自动创建并运行;右键编辑器里的类文件,选 Run 'HelloWorld.main()';或者在顶部工具栏的配置下拉框里点 Edit Configurations 手动新建。
自动创建的配置保存在项目目录下的.idea/runConfigurations或者工作区的.idea/workspace.xml里。这就是为什么有时候换了台机器,或者删了.idea目录,运行按钮的配置就消失了的缘故。.idea目录是 IDEA 的项目配置目录,里面有编码设置、模块信息、运行配置等,团队协作时一般会把其中一部分加入版本控制,另一部分(如workspace.xml)排除掉,因为里面存的是个人偏好。
运行配置里的 "Use classpath of module" 这一项指定了运行时用哪个模块的 classpath。单模块项目永远是那一个;多模块项目里如果选错了模块,会出现"找不到主类"或者"找不到依赖的类"这类问题。
启动类旁边的下拉框,如果有多个主类,会同时列出多个配置。切换运行目标的时候,注意看清楚选的是哪个,这个细节出错率挺高。
4.2 控制台输出与编码问题处理
运行成功后,底部 Run 窗口会打印:
Hello, Java! Process finished with exit code 0exit code 0表示程序正常结束。非 0 就是异常退出了,具体的异常堆栈会在上面几行显示出来。
如果输出的是乱码,说明编码设置不一致。处理路径分三层:
第一层是源文件编码。Settings → Editor → File Encodings,把 Global Encoding、Project Encoding、Default encoding for properties files 三项全部设为 UTF-8,并勾选 "Transparent native-to-ascii conversion"。
第二层是编译时的编码。有些项目在pom.xml或build.gradle里单独指定了编码格式,跟 IDEA 的设置冲突,这时以构建文件里的为准。
第三层是运行时的编码。可以在 Run Configuration 的 VM options 里加一行:
-Dfile.encoding=UTF-8如果每次新建配置都要加很烦,可以在 Help → Edit Custom VM Options 里给整个 IDEA 加上同样的参数,一劳永逸。
注意:Windows 系统的默认控制台编码历史上是 GBK,这跟 UTF-8 的源文件天然冲突。三层编码设置的核心原则是"保持一致",只要有一层掉队,乱码就出现了。
4.3 几个运行期常见报错的快速定位
跑不起来的时候,看报错的第一行最关键。整理几个高频的:
| 报错信息 | 根因 | 处理方式 |
|---|---|---|
| 找不到或无法加载主类 | 类没编译、包名不对、classpath 选错 | 检查类的完整限定名、Rebuild 项目、确认运行配置的模块 |
| 无效的源发行版 | Language level 和 JDK 版本不匹配 | Project Structure 里把 Language level 和 SDK 调成一致 |
| 编码 GBK 的不可映射字符 | 源文件含中文且编码设置不对 | 统一设为 UTF-8,重新编译 |
| 找不到符号 | 类没导入、拼写错误、依赖缺失 | 检查 import 语句、Alt+Enter 快速修复 |
| 错误:需要 class、interface 或 enum | 类外面有多余内容、括号不配对 | 检查花括号层级,用 Ctrl+Alt+L 格式化代码 |
这些报错百分之八十都跟配置相关,跟你的代码逻辑关系不大。新手容易陷入"我代码是不是写错了"的自我怀疑,其实先去 Project Structure 里核对一遍 SDK 和 Language level,问题往往当场就解决了。
5. Project Structure 里必须理解的三个标签页
Project Structure 是 IDEA 里信息量最大的配置面板,快捷键是 Ctrl+Alt+Shift+S。里面有三个标签页跟新手直接相关,不理解它们,后面很多问题都会卡住。
5.1 Project 标签页:全局级别的版本约定
Project 标签页管的是整个项目的默认约定,三个字段:
Project name项目名,改这里会同时改磁盘目录名的显示。
Project SDK项目使用的 JDK。这个设置是项目级别的默认值,模块如果没有单独指定,就继承这里。
Project language level语言级别,决定了编译器允许使用哪些 Java 语法特性。这个字段是一堆人踩坑的重灾区:你把 SDK 设成 JDK 21,但 language level 还是默认的 8,那么 switch 表达式、record、文本块这些新语法全部会标红。反过来,SDK 是 8 但 level 设成 21,编译时直接报"无效的源发行版"。
我的习惯是每次新建项目都到这里看一眼,确认 SDK 和 language level 的版本号对得上。这是十秒钟的动作,能省掉后面半小时的排查。
5.2 Modules 标签页:源码目录和依赖
Modules 标签页管的是模块级别的配置,最常用的三个子页:
Sources子页显示模块的目录结构,每个目录的分类用颜色区分。蓝色 Sources、绿色 Test Sources、黄色 Resources、橙色 Test Resources、灰色 Excluded。你可以在这里手工把某个目录标记成源码根目录,也可以把编译输出目录(通常叫out)标记成 Excluded,避免被误当成源码扫描。
Dependencies子页列出模块依赖的所有内容,包括 JDK、其他模块、第三方 jar 包。如果引入了外部库但在代码里引用不到,第一件事就是来这里看 jar 包在不在列表里。
Paths子页指定编译输出的位置。默认是项目根目录下的out/production/模块名。这个目录是编译器自动生成的,不需要手动维护,建议加进.gitignore。
5.3 SDKs 标签页:多个 JDK 的共存管理
如果机器上装了多个 JDK 版本,SDKs 标签页里会列出全部。每个条目显示名称、版本、路径。项目用哪个,在 Project 标签页里指定就行,随时可以切换。
实际工作中经常遇到"老项目要用 JDK 8,新项目要用 JDK 17"的情况。做法很简单:两个 JDK 都装好,都在 SDKs 里登记,然后每个项目各自指定。IDEA 会按项目去调用对应的 JDK,互不影响。这比来回改环境变量优雅太多。
提示:在 SDKs 里新增 JDK 时,路径要选到 JDK 的根目录(里面能看到
bin、lib、jre这些文件夹),不要选到bin里面去。选错层级 IDEA 会提示"无效的 SDK 主目录"。
6. 几个我在实际使用中攒下来的操作习惯
讲完流程,分享一些纯经验层面的东西。这些在官方文档里基本找不到,都是日常用出来才知道的。
6.1 关于缓存和索引的那些事
IDEA 会在项目目录里维护一套索引,用来支撑代码补全、跳转、重构这些功能。索引正常的时候一切都好,索引损坏的时候会出现各种匪夷所思的现象:明明代码是对的,满屏红波浪线;明明删掉了的类,补全里还能搜到。
遇到这种情况,走 File → Invalidate Caches / Restart,选 "Invalidate and Restart"。IDEA 会清空索引并重启,重启后会重新扫描项目。整个过程视项目大小从几十秒到几分钟不等。这个操作我大概每两三个月会主动做一次,或者在大版本升级之后做一次,能规避掉很多莫名其妙的问题。
还有一个细节:不要在 IDEA 正在扫描索引的时候去改目录结构或者删文件,索引和实际文件不同步的几率会明显上升。底部状态栏有个进度条在动的时候,稍微等一等。
6.2 值得早点养成的三个键位习惯
格式化代码:Ctrl+Alt+L。写完一段代码顺手按一下,缩进、空格、换行全给你排整齐。格式统一之后,代码的可读性提升非常明显,而且这个习惯越早养成越好,等到写了几千行再回头调格式,成本高得多。
快速修复:Alt+Enter。光标停在红色的地方按这个,IDEA 会给出修复建议,包括导入缺失的包、添加类型转换、生成方法等等。新手判断"这个报错该怎么修",最有效的办法就是先按一下 Alt+Enter 看它建议什么,看多了自然就有感觉了。
全局搜索类:Ctrl+N(Windows/Linux)。输入类名的一部分就能跳转,支持模糊匹配。项目大了之后,靠目录树一层层展开找类效率太低,用搜索是主流做法。对应的还有 Ctrl+Shift+N 搜文件、Ctrl+Shift+F 全局搜内容。
这几个键位组合,不用刻意背,找个空闲的下午把每个键按二十遍,形成肌肉记忆之后就是纯收益了。
6.3 项目跑通之后的下一步练习方向
第一个程序跑起来了,说明工具链的闭环打通了,这是个很有意义的节点。往后走的路,我给一个参考顺序:
先把基础语法过一轮,变量、运算、分支、循环、数组、方法。每学一个知识点就在 IDEA 里写个小类验证一遍,不要只看看就过去。然后是面向对象部分,类、对象、继承、多态、接口、抽象类,这部分是 Java 的核心,也是面试里占比最高的板块。集合框架(List、Map、Set)、异常处理、IO 流、多线程,这几个按顺序往上叠。
练习的题目不用一开始就找复杂的,冒泡排序、字符串反转、斐波那契数列、九九乘法表这种小而完整的问题,反而是最能练手感的。写完之后不要满足于"结果对了",再想一层:这段代码如果输入是空的会怎样,如果数据量到一百万条性能上有没有问题。这种自我追问的习惯,是区分"会写"和"写得好"的分水岭。
另外提一句,IDEA 里跑单个类很方便,但如果你想练习写多个类互相配合,就需要注意包的组织。一开始不需要设计得很完美,先把类分门别类地放到不同的包里,哪怕包名起得不够讲究,也比全部堆在默认包里强。等到你开始接触到实际项目,会发现包结构的设计本身就是一个值得琢磨的问题,早一点建立这个意识没有坏处。
最后说一个我觉得挺重要的心态问题。新建项目、配置 SDK、解决编码问题这一整套动作,第一次做会觉得很琐碎,甚至有点烦。但这些恰恰是真实开发里每天都要面对的东西,配置环境的熟练度直接决定你进入编码状态的速度。我见过不止一个人,语法学得挺扎实,一到新机器上配环境就卡半天。把今天这套流程反复走三遍,第三遍的时候你会发现大部分操作已经变成下意识的动作了,这个熟练度是练出来的,没有捷径。