如果你最近在翻技术社区,或者打开招聘软件看移动端岗位的要求,大概率会反复撞见同一个词:Kotlin。这三年我自己的感受特别明显,以前项目里 Java 还能稳坐半边天,现在新开的安卓工程几乎默认就是 Kotlin,甚至不少后端服务端也把 Kotlin 列为可选语言。作为一个写了好几年 Java、又转向 Kotlin 的老程序员,我特别清楚新手卡在第一步的那种感觉:环境还没搭利索,热情就先凉了一半。这篇是【Kotlin系列】的第一篇,核心就两件事——把环境搭建彻底讲透,用最短路径跑通 Hello World。
这篇文章不是给你抄一个命令就完事,而是把“为什么要这么搭”“选哪个版本”“踩到坑怎么排”全部拆开。适合三类人:刚开始学 Kotlin 的学生、打算从 Java 转 Kotlin 的工程开发、以及想要快速在安卓或服务端落地 Kotlin 的团队新成员。我会尽量用大白话,把那些文档里写了但没人解释的细节补齐,你照着操作一遍,基本不会再被环境问题拦住。
1. 先搞明白:我们学的到底是一门什么语言
1.1 为什么选 Kotlin 而不是继续 Java
Kotlin 是由 JetBrains 公司开发的静态类型编程语言,2011 年首次亮相,2016 年发布 1.0 正式版,2017 年 Google 宣布安卓开发的一等支持语言名单里有它,之后热度一路走高。它不是替代 Java 的“革命者”,而是站在 Java 肩膀上做了大量现代化改进的“继承者”:代码更简洁、空指针安全是编译期设计的一部分、函数式编程特性一等公民化,同时又和 Java 有近乎无缝的互操作性。
很多人问我:“我 Java 还没学明白,直接学 Kotlin 能行吗?”我的答案是能,但有个前提:你至少要理解类、对象、方法、变量的基本概念。Kotlin 语言的曲线比 Java 平滑很多,它把那些啰嗦的样板代码砍掉了一大半,比如 getter/setter、构造函数重载、数据类,写起来非常省事。但如果你连 JVM 是什么都不清楚,可能会在环境阶段就被“JDK、Gradle、SDK”这些词绕晕。所以这篇文章也会顺带把环境背后涉及的 JVM 概念讲清楚。
1.2 学 Kotlin 需要哪些知识储备
严格来说,跑通 Kotlin 的 Hello World 只需要三个东西:一台电脑、一个 JDK、一个能写代码的工具。可选的工具包括 IntelliJ IDEA、Android Studio、VS Code、甚至纯命令行。对于初学者,我强烈建议使用 IntelliJ IDEA Community 版,原因后面会讲。
你不需要提前装好安卓 SDK,也不需要会 Gradle。这两样只在开发安卓或复杂后端项目时才需要。第一篇我们聚焦在最简单的 JVM 命令行应用上,把“编译 Kotlin 代码 → 生成字节码 → 在 JVM 上运行”这个最核心的链路跑通。这条链路一旦通了,后面的安卓开发、后端开发、协程、Compose,都只是在此之上叠加模块而已。
2. 环境搭建:从 JDK 到 IDE 的一次性配置
2.1 JDK 版本选择:用 17 还是 21
Kotlin 编译器和运行时依赖 Java Development Kit(JDK)提供的 Java 虚拟机、标准库和编译工具链。所以第一步永远是装 JDK。Kotlin 官方对 JDK 版本的支持范围很广,从 Java 8 到 Java 21 都能编译运行,但我个人的推荐是:新学者直接选 JDK 17 或 JDK 21。
为什么要选这两个版本?因为 JDK 17 是 Java 长期支持版本,绝大多数公司生产环境已经迁移到这个版本以上,生态兼容性最好。JDK 21 是更新的长期支持版本,提供了分代 ZGC 等新特性,如果你想站在未来视角学习,选它也没问题。我自己开发的时候用的是 JDK 17,主要原因是很多老项目用的 Gradle 版本、Spring Boot 版本还没完全适配到 JDK 21,没必要在这种地方给自己添堵。
下载 JDK 的时候,建议选 Eclipse Temurin 或 Microsoft Build of OpenJDK。这两个发行版都是开源免费、社区活跃、更新及时的 OpenJDK 构建产物。国内用户如果不方便访问境外站点,可以从国内镜像站下载 Temurin,或者直接用阿里云、腾讯云的厂商授权发行版。说实话,JDK 本身不区分“学习版”和“生产版”,你下载任何一个主流的 OpenJDK 发行版都可以。
2.2 安装 JDK 并配置环境变量
安装方式分两步:先把 JDK 解压或通过安装包装好,再配置三个环境变量:JAVA_HOME、PATH、CLASSPATH(可选)。我以 Windows 和 macOS 各说一遍,因为你很可能在这两个系统之间二选一。
Windows 用户下载 .msi 或 .zip 包。如果是 .msi,双击安装,一路下一步即可。注意安装路径不要带空格和中文,比如C:\Program Files\Eclipse Adoptium\这种路径虽然能用,但我见过不少环境下因为空格导致脚本出问题的例子,建议直接装到D:\jdk-17或C:\jdk-17。装完以后,右键“此电脑”→“属性”→“高级系统设置”→“环境变量”,新建一个系统变量:变量名JAVA_HOME,变量值填你的 JDK 安装目录,比如C:\jdk-17。然后在Path变量里追加一行%JAVA_HOME%\bin。这里的关键点是追加,不是替换,很多新手把原来的 Path 清空,导致系统一堆命令失效。
macOS 用户就简单了,我建议直接用 Homebrew 安装:
brew install openjdk@17然后配置环境变量。在终端里执行echo 'export JAVA_HOME="/opt/homebrew/opt/openjdk@17"' >> ~/.zshrc,再执行echo 'export PATH="$JAVA_HOME/bin:$PATH"' >> ~/.zshrc,最后source ~/.zshrc。如果你用的是bash,就把.zshrc改成.bash_profile。
验证是否成功的方法相同:新开一个终端窗口,执行:
java -version javac -version能看到openjdk version "17.0.x"后就说明 JDK 装好了。
2.3 IntelliJ IDEA 安装与 Kotlin 插件
JDK 是编译器环境和运行环境,IDE 则是你写代码的“编辑器 + 编译器 + 调试器”综合体。对 Kotlin 来说,IntelliJ IDEA 是最顺手的工具,因为它本身就是 JetBrains 出的,Kotlin 的插入、补全、重构、调试体验都是天花板级别。IDEA 分两个版本:Ultimate(付费)和 Community(免费)。学习 Kotlin 基础语法,Community 版绰绰有余,完全不需要付费。
下载 Community 版,安装时保持默认配置即可。Windows 下建议勾选“创建桌面快捷方式”和“Open Folder as Project”。macOS 下把应用拖入 Applications 文件夹。
启动 IDEA 以后,首次需要激活插件。如果你下载的是 2022.3 以上的新版本,IDEA 默认自带 Kotlin 插件,无需单独安装。如果是老版本,需要在插件市场搜索 Kotlin,安装后重启。这一步其实很容易出问题,因为插件下载源在国外,网络慢时可能一直转圈。你在插件市场搜索的时候如果半天没反应,可以考虑去 JetBrains 插件官网下载对应 IDE 版本的 Kotlin 插件 zip 包,然后选择“Install Plugin from Disk”安装。这也是我实际帮同学排查时用得最多的解法。
2.4 命令行工具:掌握 kotlinc 的关键性
虽然 IDE 能帮你隐藏很多细节,但我想再多说一个“非必须但很有用”的工具:Kotlin 命令行编译器kotlinc。它可能在你理解“Kotlin 是怎么变成可执行程序”的路上提供很大帮助。
Kotlin 官方提供了命令行工具包,你可以从 GitHub Releases 下载Kotlin 编译器压缩包,解压以后把bin目录加入 PATH。或者用 SDKMAN 安装:
sdk install kotlin安装完成后在终端执行kotlinc -version能输出版本号就表示成功。命令行编译器的价值在于:它可以绕开 IDE 的复杂配置,在最纯净的环境下帮你确认“JDK 正常、编译器正常、代码本身没问题”。初学者用命令行跑一遍,再回 IDE 里操作,很多报错一眼就能看出原因。
沿着命令行这条路继续理解执行过程,我推荐一条完整链路。创建hello.kt文件后执行:
kotlinc hello.kt -include-runtime -d hello.jar java -jar hello.jar-include-runtime参数会把 Kotlin 标准库打包进最终的 jar,这样你用java -jar运行时不需要额外引入 Kotlin 依赖。这个细节对有经验的 Java 开发者来说很好理解,但对新手可能有点“黑魔法”的味道,实际它们不过是一条标准的“编译成字节码再交给 JVM 执行”的路径罢了。
3. Hello World:用最少步骤跑通第一段代码
3.1 新建项目时的关键选择
打开 IntelliJ IDEA,选择 “New Project”。不同版本的界面有细微差别,但关键选项不会变。第一个选项是项目类型,我们要选Java或Kotlin,不要选安卓、Compose、Web 这类带框架的模板。如果你是英文版界面,对应的是 “Java” / “Kotlin” / “JVM”。
第二个关键是选择 SDK。IDEA 会检测到你刚才装的 JDK,如果没检测到,点击下拉框的 “Add SDK”,选择 JDK,手动指向安装目录。这一步有不少人漏掉,结果IDE里新建项目报“No SDK specified”,后面无论怎么写代码都运行不了。
第三个关键是项目名和后缀。项目名建议用简单的英文,比如KotlinDemo,不要用中文路径。构建系统保持默认(新版IDEA默认用 IntelliJ 自己的构建系统,不用 Gradle 也能跑通)。等 Demo 阶段完全结束后,再引入 Gradle 来管理依赖也不迟。
最后一点,IDEA 会自动帮你生成一个Main.kt文件,里面预置了一个简单的主函数:
fun main() { println("Hello World!") }如果你不缺这一步,新建完项目后直接点编辑器区域左侧的绿色三角形就能运行。控制台会输出Hello World!。
3.2 Hello World 代码的几种写法
虽然 IDEA 自动生成的代码已经能跑,但我想把 Hello World 的几种变体也一并讲清楚,这样你以后看别人的项目时不至于迷惑。
最基础的写法:
fun main() { println("Hello, Kotlin!") }这和 Java 的public static void main(String[] args)相比,简化了不是一点半点。fun是 Kotlin 声明函数的关键字,main是程序入口,函数体用花括号包裹。默认情况下,main函数可以没有返回值,所以不需要写void或者: Unit。如果你需要接收命令行参数,可以这么写:
fun main(args: Array<String>) { println("Hello, Kotlin!") }println是 Kotlin 标准库提供的输出函数,等价于 Java 的System.out.println。另外还有一个print,区别是它不换行。让我用个生活化的类比:你往一张纸上写一排字,println会在写完以后自动换到下一行,print则一直贴着写下去。
再补充一个比较实用的写法——字符串模板。Kotlin 允许你在字符串里用$变量名直接把变量值插进去,这个特性非常常用:
fun main(args: Array<String>) { val name = if (args.isNotEmpty()) args[0] else "Kotlin" println("Hello, $name!") }在终端执行:
kotlinc hello.kt -include-runtime -d hello.jar java -jar hello.jar 老王输出结果就是Hello, 老王!。这在后续日志打印、用户界面展示里面会频繁使用,建议一开始就练熟。
3.3 理解 main 函数和 println 的两层原理
main函数为什么叫main?因为 JVM 启动的时候,会去类里面找main方法并调用它作为程序入口。Kotlin 编译器会把顶层函数main编译成一个名为MainKt的类中的静态方法,所以你在命令行运行java -jar hello.jar时,JVM 才能顺利定位到入口。
println为什么能输出?因为它最终调用的依然是 Java 的标准输出流System.out。换句话说,Kotlin 并没有重新发明一套“输出系统”,而是做了个更简洁的封装。如果你在 IDEA 的控制台看到输出,那是因为 IDE 捕获了进程的 stdout 流并展示在面板里。理解这两层,有助于你日后排查“为什么代码好像运行了但屏幕上没有字”——很可能不是你代码错了,而是输出重定向到了别的位置。
3.4 用运行配置把项目“跑起来”
在 IDEA 中,运行 Kotlin 文件最直接的方式是点击fun main()左侧的绿色三角形图标。点击后 IDEA 会默认创建一个运行配置,你可以给这个配置命名,比如Hello,然后点运行。如果编辑器里没有出现三角形,有可能是光标没有放在main函数内,或者文件没有被识别为 Kotlin 文件。此时可以右键文件 → “Run 'MainKt'”。
运行之后,下方控制台会出现程序输出,也会显示进程退出代码。看到Process finished with exit code 0就代表程序正常结束。如果出现Exception in thread "main"这样的红字,通常说明你代码中抛出了未捕获异常,或者环境变量还有问题。以上这些点,排错时非常关键。
4. 环境搭建与运行阶段的避坑记录
4.1 命令行出现“java 不是内部或外部命令”怎么办
这是新手在所有语言入门里碰到次数最多的问题。如果你在终端敲java -version提示找不到命令,99% 的原因是 PATH 变量没有配好。检查步骤其实很固定:
第一,确认 JDK 安装目录里有没有bin/java.exe或者bin/java文件。如果没有,说明安装不完整,重新安装。第二,检查JAVA_HOME的值是不是指向了 JDK 的根目录。这里有个高频错误:有人把JAVA_HOME指到了bin目录,导致路径变成了bin/bin。第三,检查Path里是否写了%JAVA_HOME%\bin,注意大小写无所谓,但百分号不能漏。第四,改完环境变量后,一定要新开一个终端窗口,因为旧窗口保存的还是修改前的环境。
我自己的经验是,Windows 下最容易出问题的就是名称和顺序。我建议把%JAVA_HOME%\bin放在 Path 列表的前面,防止系统里残留的其他 JDK 版本抢先执行。
4.2 在 IDEA 里找不到 SDK 或插件装不上
表现有两种:新建项目时 SDK 下拉框是空的,或者插件市场一直加载不出来。
SDK 为空,解决路径是进入File → Project Structure → SDKs,点加号添加 JDK,选择你安装 JDK 的根目录,注意要选到包含bin文件夹的那一级,不要选到 bin 里面。另一种做法是安装 JDK 后重启 IDEA,IDEA 会在启动时自动检测系统里已有的 JDK。
插件市场加载不出来,先不要盲目判定是环境坏了,通常是网络问题。JetBrains 插件仓库在国内访问不稳定,你可以尝试下面几种方案:修改 IDEA 的 HTTP 代理设置、用离线插件包安装、更换镜像源。离线插件包安装最省事:去 JetBrains 插件官网搜索 Kotlin,下载kotlin-xxx.zip,然后在 IDEA 里Settings/Plugins → ⚙ → Install Plugin from Disk,选择该 zip 文件后重启。离线安装的时候,版本匹配很关键,下载页一般会提示支持的最小 IDEA 版本,认准了再装,否则可能出现 IDEA 界面都打不开的严重后果。
4.3 运行按钮是灰色的或者点了没反应
这种情况往往不是代码问题,而是 IDEA 还没找到你的主类。检查点:Main.kt是否有fun main();该函数是否位于src目录(IDEA 里的Source Root);鼠标点击在函数内部后,左侧是否有绿色图标出现。如果没有,可以右键Main.kt,然后选择 Run。如果在右键菜单里没有Run,说明 IDEA 还没有把这个文件识别为可执行文件,需要先检查文件是否放在src目录内,以及项目 SDK 是否配置好。
一个更隐蔽的坑是:你在构建系统上选择了 Gradle 而不是 IntelliJ,但 Gradle 的 JDK 路径没配置正确。Gradle 默认会用项目的 JDK,如果JAVA_HOME指向了不存在的位置,Gradle 同步就会出错,运行按钮会一直转圈。这种情况去Settings → Build, Execution, Deployment → Build Tools → Gradle里,把 Gradle JVM 改为你本机的 JDK 17 即可。
4.4 常见问题速查表
| 问题现象 | 最可能的原因 | 推荐解法 |
|---|---|---|
终端java -version报找不到命令 | PATH 未配置或配错 | 修复JAVA_HOME和 PATH,新开终端验证 |
| IDEA 新建项目时无 SDK | IDE 没检测到 JDK | 手动添加 JDK 路径,或重装JDK后重启 |
| Kotlin 插件市场打不开 | 网络原因 | 用离线 zip 安装插件 |
| 运行按钮灰色 | 未识别 main 函数 | 确认文件在 Source Root 且含fun main() |
运行时报ClassNotFoundException | 构建配置不对 | 检查 IDEA/Gradle 的 Project SDK 设置 |
| 控制台输出中文乱码 | 文件编码或控制台编码不一致 | 将项目 Encoding 设为 UTF-8,控制台设置为 UTF-8 |
kotlinc命令找不到 | 命令行工具未加入 PATH | 添加kotlin/bin到 PATH 并重启终端 |
如果你第一次跑通就遇到乱码问题,推荐优先把文件编码改成 UTF-8:Settings → Editor → File Encodings,把 Global Encoding、Project Encoding、Properties Files 都改为 UTF-8。
4.5 一个让我印象很深的“玄学问题”
我刚开始带朋友入门时,遇到过一种情况:项目代码完全一样,一台电脑能跑,另一台死活报Error: Could not find or load main class MainKt。排查了大半天,最后发现是两台电脑的 IDEA 项目构建系统不同,一台是 IntelliJ 原生构建,另一台是 Gradle 构建。Gradle 构建时,IDEA 没有自动刷新依赖,导致编译输出目录里根本没有生成MainKt.class文件。
解决方法很简单:在 Gradle 面板点一下刷新按钮,或者执行Tasks → build → clean后重新运行。这个经历让我明白,所谓“玄学”问题,90% 都和构建工具的状态有关。以后你换电脑开发时,遇到类似问题,先检查构建工具的同步状态,大概率能省下好多时间。
5. 入门阶段要避开的几个心态陷阱
5.1 不要一上来就追求“安卓开发从零到一”
很多人听说 Kotlin 是安卓官方语言,就想着干脆直接学安卓,跳过命令行 Kotlin。我的态度很明确:不推荐。安卓开发涉及 Activity、布局文件、生命周期、Gradle 依赖、模拟器、SDK 版本兼容等一系列额外知识,任何一个环节出问题都会让人怀疑人生。而纯 Kotlin 语法学习,你只需要一个命令行或一个 IDEA,就能把所有核心语法、函数式编程、协程、集合操作练透。等语法基础扎实了,再进入安卓或服务端开发,你会觉得事半功倍。
如果把 Kotlin 比作开车,那么基础的语法就是油门、刹车、方向盘,安卓框架就是城市路况、红绿灯和停车场。你不可能刚上车就开始挑战早晚高峰的高架桥,先找个空旷场地把方向盘握熟,再上路才合理。
5.2 学会阅读报错信息
新手最常见的坏习惯是看到红色报错就慌,直接截图发群里问。实际大多数报错已经写得明明白白。比如Unresolved reference: println,说明编译器不认识println,大概率是文件没被当作 Kotlin 文件识别。再比如Exception in thread "main" java.lang.NumberFormatException说明你试图把字母转换成数字。每次报错花两分钟读一下,把关键词提取出来,去搜索框搜索,往往比你等别人的回复要快得多。
我自己的习惯是:读报错从下往上看。Java/Kotlin 的异常堆栈最底部往往是最早出现的异常源头,最顶部只是当前调用位置。从下往上找,在高亮业务代码行附近,通常就是真正的出错点。
5.3 把“能跑”当成“学会了”?还早着呢
Hello World 跑通,意味着环境没问题,这是万里长征第一步。接下来建议按这个顺序练习:变量与类型、条件控制与循环、函数定义与默认参数、数据类与解构、空安全与?、集合操作、协程基础。每换一个主题,写一个 20 行以内的小程序,在控制台反复跑,直到形成肌肉记忆。
如果你以后做后端,也别落下 Kotlin 的data class和协程;如果你以后做安卓,val/var的可变性思维、密封类、扩展函数也会是加分项。Kotlin 的语言设计哲学,是“让不变性成为默认选项,让可空性被显式表达”——现在打好基础,将来读第三方框架源码会轻松很多。
5.4 遇到问题先查这三类来源再问人
我给大家一个排错顺序:第一,看官方文档的 Kotlin 基础部分,这是最权威的;第二,看社区问答平台上的同款问题,注意看采纳答案和回复时间,太老的方案可能已不适用;第三,用英文搜关键词,实测英文资料的覆盖面和时效比中文资料快很多。问别人永远排到最后,因为你可能连问题本身都没描述清楚。
这套方法论其实不只适用于 Kotlin,任何新语言、新框架的学习都是同一个套路。环境搭建问题十有八九是版本、路径、网络造成的,很少是代码逻辑问题,所以冷静下来按模块排查,效率会大幅提升。
最后再分享一个小技巧:给本机留下一个干净的“最小环境”。我每次搭新语言环境,都会整理一份备忘录,记录安装时间、安装路径、版本号、环境变量的值。半年后换新电脑,照着备忘录十分钟就能把环境复原。Kotlin 学习也一样,这些看着很笨的记录习惯,其实才是你从新手变成老手最快的路径。