路径|和 .project 文件说“再见”—— VS Code Java 1.1.0 背后的故事

微软中国MSDN 点击上方 蓝字关注我们
Language Support for Java 1.1.0 版本包含了一项重要更新:现在插件在导入新的 Java 项目时 ,项目元数据文件(.project , .classpath , settings等)默认将不再生成于 项目路径下 。 这一问题自2018年被记录至今已有超过三年的时间 。 本文旨在记录并分享我们解决这一问题的过程和最后的解决方案 。

  • 项目元数据文件: https://0x9.me/2SXBx
  • 项目路径: https://0x9.me/OgPf0
悬在头顶的“达摩克利斯之剑”
随着 VS Code Java 的功能逐渐丰富 , 用户数量也在稳步上升 。 但是由于 Java 插件在导入项目时 , 会在项目目录下生成元数据文件的问题 , 我们得到了不少的1星差评 。 可以预见 , 随着用户基数增加 , 因这一问题而造成的差评数量也会增加 。 这就如同一把悬在我们头顶的“ 达摩克利斯之剑” , 如果不及时解决 , 问题随时都有可能爆发 。
其实这并不是我们产品组不想彻底修复这一问题 , 根本原因需要从 Java 语言服务的架构说起:

路径|和 .project 文件说“再见”—— VS Code Java 1.1.0 背后的故事
文章图片

展开全文JDT Java Language Server 架构示意图
VS Code Java 项目背后所采用的 Java 语言服务的正式项目名称是 Eclipse JDT Language Server? , 由微软和 红帽联手开发 。 在上面的项目架构图中可以看到 , 我们在实现中复用了 Eclipse 的一些模块 , 而这些自动生成的元数据文件也正是由其中一些上游模块所产生 。 在 Eclipse 的讨论区中可以找到一条相关的讨论帖子 。 这条帖子的创建时间甚至可以追溯到2004年 。 由于在实现时 , 这些元数据文件的路径就已经作为常量被硬编码在了代码里 , 这些 常量又被各个不同的 Eclipse 模块甚至是插件引用 , 经年累月下来这一问题从某种意义上已经成为了“历史包袱” 。
考虑到改变上游模块的行为包含了太多的未知和不确定性 , 在过去我们尝试给用户提供一些变通方法 , 比如让这些元数据文件在 VS Code 的文件浏览器中隐藏 , 并引导用户将他们添加至 .gitignore 当中 。 但从用户的反馈来看 , 这些方式并没有让用户感到满意 。 为了能够彻底解决这个已经困扰了我们以及用户三年多之久的“ 顽疾” , 我们在今年下半年决定再做一次尝试 , 希望能将其“根治” 。
  • 达摩克利斯: https://0x9.me/AXyMF
  • 红帽: https://0x9.me/asDhl
  • 常量: https://0x9.me/qHgaN
  • 顽疾: https://0x9.me/gAMnX
方案一
使用 Symbolic Link(失败)
我们最先想到的方法是使用 Symbolic Link 。 在导入项目时 , 可以将被导入的项目通过 Symbolic Link 的方式链接到一个用户看不到的地方 , 从而让元数据文件生成在链接后的路径下 。 但很快这一方案就遇到了问题——在某些操作系统下创建 Symbolic Link 需要特定的权限 , 否则会抛出 FileSystemException , 这显然不是我们想要的效果 , 因此这个方案马上被否决了 。

推荐阅读