开源Metals v2:Databricks面向数百万行代码库的Java和Scala语言服务器

开源Metals v2:Databricks面向数百万行代码库的Java和Scala语言服务器

💡 原文英文,约2200词,阅读约需8分钟。
📝

内容提要

Databricks通过扩展Metals语言服务器,开发了Metals v2,以支持其2600万行Bazel单体仓库中的Scala和Java代码导航。该版本优化了索引、编译器和构建集成,实现快速启动和低延迟响应,使Cursor成为IntelliJ的可行替代品。Metals v2已开源,供大型代码库用户使用。

🔎

延伸解读

架构取舍:为代理时代优化

Metals v2 的设计优先考虑快速代码定位而非全面的补全和重构功能,因为代理编写了大部分代码。这种取舍体现在其索引和编译器管道的构建上,旨在实现低延迟的导航和诊断。对于大型代码库的团队,这暗示了语言服务器可以针对特定工作负载进行定制,而不是追求功能的全覆盖。

启动性能的量化指标

文章引入了“初始智能时间”(TTII)作为衡量编辑器在打开仓库后多快变得有用的指标。在 Databricks 的 26M 行代码库中,p50 为 8.7 秒,p90 为 36.7 秒,而符号搜索的 p50 为 10 毫秒。这些数据为评估大型代码库中 IDE 的响应性提供了基准,并强调了启动性能作为关键用户体验指标的重要性。

构建集成的设计原则

Metals v2 的构建集成设计避免了与开发者构建竞争:它不会在后台自动调用 Bazel,而是将构建同步作为显式用户操作。此外,它采用按需同步单个文件或目录,而不是预定义的同步集。这种方法减少了构建锁冲突,并允许更聚焦的同步,这对于大型单体仓库中的开发效率至关重要。

开源与社区协作

Metals v2 以 Apache 2.0 许可证开源,由 VirtusLab 主导开发,并得到了 Cursor 团队和 Databricks 的贡献。这一合作模式旨在为大型 JVM 代码库提供共享基础设施,并鼓励其他公司参与塑造其发展。对于考虑采用 Metals v2 的团队,这意味着他们可以依赖社区支持,并有机会影响项目的路线图。

Q&A

Metals v2是什么?它解决了什么问题?

Metals v2是Databricks基于Metals语言服务器扩展开发的,用于支持大型Java和Scala代码库(如2600万行Bazel单体仓库)的代码导航。它解决了现有JVM语言服务器在大型代码库中启动慢、延迟高的问题,使轻量级编辑器(如Cursor)成为IntelliJ的可行替代品。

Metals v2如何实现快速启动?

Metals v2通过mbt索引实现快速启动。mbt索引是内容寻址的,基于Git blob OIDs,可以快速发现文件并复用索引条目。它存储了文件包声明、定义位置和标识符的布隆过滤器,支持快速符号搜索和跳转定义。在Databricks,加载预构建索引仅需5秒,生产环境中的TTII(时间到初始智能)p50为8.7秒。

Metals v2的Scala管道是如何工作的?

Metals v2的Scala管道基于演示编译器,支持两种模式:回退模式和精确模式。回退模式在构建同步前使用,将仓库中所有源文件视为依赖候选,提供即时导航;精确模式在构建同步后使用,限制在构建服务器报告的类路径和源路径内,提供构建准确的诊断。两种模式都利用编译器缓存和惰性符号解析来管理大型代码库。

Metals v2如何支持Java?

Metals v2直接基于javac API实现Java语言服务器功能,包括诊断、导航、语义高亮等。它使用turbine-classpath模式处理大型代码库,通过修改的Turbine编译器生成仓库类路径,避免javac的enter阶段性能问题。Turbine每秒处理近百万行Java代码,使Metals能定期重新编译整个Java代码库。

Metals v2的构建集成有什么特点?

Metals v2的构建集成采用BSP服务器,但设计上避免与开发者构建竞争。它不会在后台自动调用Bazel,而是由用户显式触发同步。同步的元数据存储在JSON快照中,通过常量池优化。用户按需同步单个文件或目录,而不是使用预定义的同步集,以提高效率。

Metals v2在Databricks的采用情况如何?

Metals v2在Databricks的采用率显著提升。截至2026年7月,92%的周活跃IDE用户使用Cursor,而IntelliJ为12%。在Scala和Java文件打开事件中,Cursor的占比从40%升至78%。此外,Databricks今年未续订大部分IntelliJ席位。

Metals v2是否开源?如何获取?

是的,Metals v2已开源,采用Apache 2.0许可证。它可在Cursor、VS Code和Neovim中使用,安装说明可在Metals网站上找到。

🏷️

标签

➡️

继续阅读