3步跑出自建IntelliJ IDEA:一次讲透模块化IDE的构建机制
【免费下载链接】intellij-communityIntelliJ IDEA & IntelliJ Platform项目地址: https://gitcode.com/GitHub_Trending/in/intellij-community
把自己手里用的IDE从源码构建出来,不只是极客行为——看懂 IntelliJ IDEA 源码如何把几百个模块拼成一个可运行的产品,你对模块化开发的理解会直接上一个台阶。接下来15分钟,你会从一条终端命令开始,跑到自己启动的 IDEA,并说清楚仓库里那些 .iml 文件在干什么。
30秒先拿到一个能跑的 IntelliJ IDEA
想先看结果,就记住这3行。这是 IDEA 源码构建的最短路径:克隆仓库,然后用项目自带的 Bazel 包装脚本直接启动"主"目标——
git clone https://gitcode.com/GitHub_Trending/in/intellij-community cd intellij-community ./bazel.cmd run //build:idea_community第一次运行要下载大量工具链和依赖,耗时很长属正常。⚠️ 在第三行真正编译前,记得先执行一次./getPlugins.sh(下面逐步走时会展开)。
一条命令为什么能装出整个 IDE:.iml 到 Bazel 的生成链
先打个比方:把整个仓库想象成中央厨房。每个*.iml文件是一张"配方卡",写清一个模块需要哪些原料(源码目录、依赖);Bazel 是厨师,各目录下的BUILD.bazel是把配方翻译成的"工单"。关键在于工单是从配方生成的——仓库约定(见 AGENTS.md)里,.iml 才是 source of truth,BUILD.bazel 由它推导而来。
那 IDE 本身是什么?看根目录 BUILD.bazel 里的main规则:
jvm_library( name = "main", module_name = "intellij.idea.community.main", runtime_deps = [ "//platform/lang-api:lang", # 语言服务 "//java/openapi:java", # Java 语言支持 # ……一共挂着上百个模块依赖 ], )runtime_deps就是一份"点单清单":清单上挂了哪个模块,IDE 就带哪块能力。所谓"模块化配置",本质上是往这份清单里加减名字。用 IDEA 打开仓库的入口是 .bazelproject 文件,README.md 要求装好 Bazel 插件,纯 IDE 内构建已不再支持。
从克隆到启动:4步流程完整走一遍
第一步:拉代码。就是开头前两条命令;不关心历史记录的话,clone 后加--depth 1可以省掉大量等待。
第二步:补上 Android 模块。Android 相关功能不在主仓库里,而在独立仓库中,跑项目自带的脚本即可取回:
./getPlugins.sh # Windows 用 getPlugins.bat翻 getPlugins.sh 会发现它只有一行 git clone——为什么单独拉?因为两个仓库必须分支对齐,版本错配是后续编译报错的高发原因。
第三步:打开工作区。用 IDEA 开发就点 File | Open 直接选根目录的.bazelproject,让 IDE 通过 Bazel 读懂模块关系;不想进 IDE 的话,根目录跑bazel-build-all-community.cmd先编译全部目标也行。
第四步:启动。就是第一板块的第三行:
./bazel.cmd run //build:idea_community//build:idea_community是 build/ 目录下的启动目标。首次编译通过后,拉起来的界面长这样:
从此你改任何代码,都能靠再次启动来验证,这就是"自建 IDE"的全部意义。
按自己的需求改:3个最常见的模块化配置
这一节挑你接触 IDEA 源码时最可能动手的三处,都按"改哪里→怎么改→怎么验证"来讲。
只打当前系统的安装包
改哪里:给 installers.cmd 传参数。怎么改:
./installers.cmd -Dintellij.build.target.os=current怎么验证:产物目录里只剩当前操作系统的安装包,其余平台被跳过。全部可选参数见 OpenSourceCommunityInstallersBuildTarget.kt。
给 IDE 增减一个模块
改哪里:根 BUILD.bazel 的runtime_deps清单。怎么改:按约定先改 .iml、再让构建脚本重新生成 Bazel 目标——修改对应模块的.iml(可参考根目录 intellij.idea.community.main.iml),然后运行build/jpsModelToBazelCommunityOnly.cmd重新生成,而不是手改 BUILD.bazel。
[!WARNING] 手改
runtime_deps的顺序或内容容易和生成脚本打架,务必走"以 .iml 为准"的流程。
怎么验证:bazel build //:main编译通过后启动,确认对应功能入口出现或消失。
换掉产品的外观信息
改哪里:community-resources/ 下的resources/目录。怎么改:IdeaApplicationInfo.xml等产品信息与lafs/里的窗口框架图都在这里,由 community-resources/BUILD.bazel 打包进 IDE,替换资源后重新构建即可。怎么验证:启动后看关于页的产品名和窗口样式。
构建失败或启动不了?先查这4处
| 问题 | 结论 | 原因与处理 |
|---|---|---|
| 首次构建特别慢 | 正常现象 | Bazel 在下载工具链与依赖,后续走缓存 |
| IDEA 提示缺 Bazel 插件 | 装插件 | IDE 纯构建已不支持,见 README.md |
| Android 模块编译不过 | 两仓库分支错位 | 用 git checkout 对齐分支后重跑 getPlugins.sh |
| Windows 克隆报路径过长 | Git 配置缺失 | git config --global core.longpaths true |
想跑测试的话,按 README 的"Running IntelliJ IDEA in a CI/CD environment"一节用tests.cmd系列入口,参数用法都有说明。
IDE 本质是几百个模块的一份"点单清单",.iml 与 Bazel 是拼盘的那双手。下一步建议你跑一次installers.cmd,亲手产出一个安装包,完整体验模块到成品的最后一公里。
【免费下载链接】intellij-communityIntelliJ IDEA & IntelliJ Platform项目地址: https://gitcode.com/GitHub_Trending/in/intellij-community
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考