[{"data":1,"prerenderedAt":551},["ShallowReactive",2],{"navigation":3,"post-\u002Fposts\u002F2026\u002Fuse-vscode-for-kotlin":20,"surroundPosts-\u002Fposts\u002F2026\u002Fuse-vscode-for-kotlin":544},[4,8,12,16],{"title":5,"path":6,"stem":7},"首页","\u002F","00.index",{"title":9,"path":10,"stem":11},"文章","\u002Fposts","01.posts",{"title":13,"path":14,"stem":15},"动态","\u002Fmoments","02.moments",{"title":17,"path":18,"stem":19},"关于","\u002Fabout","09.about",{"id":21,"title":22,"body":23,"class":527,"cover":527,"coverSize":527,"date":528,"description":29,"draft":529,"extension":530,"hideComments":529,"location":527,"meta":531,"navigation":414,"path":532,"readingTime":533,"seo":538,"sitemap":539,"stem":540,"tags":541,"time":527,"weather":527,"__hash__":543},"posts\u002Fposts\u002F2026\u002F20260124.use-vscode-for-kotlin.md","使用 VSCode 开发 Kotlin",{"type":24,"value":25,"toc":525},"minimark",[26,30,33,44,53,56,132,139,322,338,352,358,507,510,518,521],[27,28,29],"p",{},"之前有些后端项目用的 Kotlin + Spring Boot，IDE 用的 IDEA 开发的。但是 IDEA 中的 GitHub Copilot 插件实在太弱智，打算换成 VSCode 来开发 Kotlin。",[27,31,32],{},"网上几乎没有教程（可能确实没人这么干），踩了不少坑，试了很多插件，花了快一天时间才终于搞好。",[27,34,35,36,43],{},"首先，需要安装 VSCode 的 ",[37,38,42],"a",{"href":39,"rel":40},"https:\u002F\u002Fmarketplace.visualstudio.com\u002Fitems?itemName=vscjava.vscode-java-pack",[41],"nofollow","Java Extension Pack"," 插件包，这个插件包包含了 Java 开发所需的各种插件。",[27,45,46,47,52],{},"然后，还需要安装 ",[37,48,51],{"href":49,"rel":50},"https:\u002F\u002Fgithub.com\u002FKotlin\u002Fkotlin-lsp\u002Freleases",[41],"kotlin-lsp"," 插件，这个是 Kotlin 官方的插件，提供了 Kotlin 的语法高亮、格式化、跳转等功能。需要注意的是，这个插件尚未发布到 VSCode 市场，需要手动下载并安装。另外，该插件当前只支持 Gradle 项目，不支持 Maven 项目。如果是 Maven 项目，得转换成 Gradle 项目才能使用该插件。",[27,54,55],{},"VSCode 配置：",[57,58,63],"pre",{"className":59,"code":60,"language":61,"meta":62,"style":62},"language-json shiki shiki-themes material-theme-lighter github-light github-dark","{\n  \"[kotlin]\": {\n    \"editor.defaultFormatter\": \"JetBrains.kotlin\"\n  }\n}\n","json","",[64,65,66,75,95,120,126],"code",{"__ignoreMap":62},[67,68,71],"span",{"class":69,"line":70},"line",1,[67,72,74],{"class":73},"sP7_E","{\n",[67,76,78,82,86,89,92],{"class":69,"line":77},2,[67,79,81],{"class":80},"s39Yj","  \"",[67,83,85],{"class":84},"sseR_","[kotlin]",[67,87,88],{"class":80},"\"",[67,90,91],{"class":73},":",[67,93,94],{"class":73}," {\n",[67,96,98,101,105,107,109,113,117],{"class":69,"line":97},3,[67,99,100],{"class":80},"    \"",[67,102,104],{"class":103},"sZMiF","editor.defaultFormatter",[67,106,88],{"class":80},[67,108,91],{"class":73},[67,110,112],{"class":111},"sjJ54"," \"",[67,114,116],{"class":115},"s_sjI","JetBrains.kotlin",[67,118,119],{"class":111},"\"\n",[67,121,123],{"class":69,"line":122},4,[67,124,125],{"class":73},"  }\n",[67,127,129],{"class":69,"line":128},5,[67,130,131],{"class":73},"}\n",[27,133,134,135,138],{},"F5 调试用的 ",[64,136,137],{},"launch.json"," 配置：",[57,140,142],{"className":59,"code":141,"language":61,"meta":62,"style":62},"{\n  \"version\": \"0.2.0\",\n  \"configurations\": [\n    {\n      \"type\": \"java\",\n      \"name\": \"SpringBoot\",\n      \"classPaths\": [\"$Auto\", \"${workspaceFolder}\u002Fbuild\u002Flibs\u002F*\"],\n      \"request\": \"launch\",\n      \"mainClass\": \"net.yuanfen.op.xams.ApplicationKt\"\n    }\n  ]\n}\n",[64,143,144,148,169,183,188,209,230,265,286,305,311,317],{"__ignoreMap":62},[67,145,146],{"class":69,"line":70},[67,147,74],{"class":73},[67,149,150,152,155,157,159,161,164,166],{"class":69,"line":77},[67,151,81],{"class":80},[67,153,154],{"class":84},"version",[67,156,88],{"class":80},[67,158,91],{"class":73},[67,160,112],{"class":111},[67,162,163],{"class":115},"0.2.0",[67,165,88],{"class":111},[67,167,168],{"class":73},",\n",[67,170,171,173,176,178,180],{"class":69,"line":97},[67,172,81],{"class":80},[67,174,175],{"class":84},"configurations",[67,177,88],{"class":80},[67,179,91],{"class":73},[67,181,182],{"class":73}," [\n",[67,184,185],{"class":69,"line":122},[67,186,187],{"class":73},"    {\n",[67,189,190,193,196,198,200,202,205,207],{"class":69,"line":128},[67,191,192],{"class":80},"      \"",[67,194,195],{"class":103},"type",[67,197,88],{"class":80},[67,199,91],{"class":73},[67,201,112],{"class":111},[67,203,204],{"class":115},"java",[67,206,88],{"class":111},[67,208,168],{"class":73},[67,210,212,214,217,219,221,223,226,228],{"class":69,"line":211},6,[67,213,192],{"class":80},[67,215,216],{"class":103},"name",[67,218,88],{"class":80},[67,220,91],{"class":73},[67,222,112],{"class":111},[67,224,225],{"class":115},"SpringBoot",[67,227,88],{"class":111},[67,229,168],{"class":73},[67,231,233,235,238,240,242,245,247,250,252,255,257,260,262],{"class":69,"line":232},7,[67,234,192],{"class":80},[67,236,237],{"class":103},"classPaths",[67,239,88],{"class":80},[67,241,91],{"class":73},[67,243,244],{"class":73}," [",[67,246,88],{"class":111},[67,248,249],{"class":115},"$Auto",[67,251,88],{"class":111},[67,253,254],{"class":73},",",[67,256,112],{"class":111},[67,258,259],{"class":115},"${workspaceFolder}\u002Fbuild\u002Flibs\u002F*",[67,261,88],{"class":111},[67,263,264],{"class":73},"],\n",[67,266,268,270,273,275,277,279,282,284],{"class":69,"line":267},8,[67,269,192],{"class":80},[67,271,272],{"class":103},"request",[67,274,88],{"class":80},[67,276,91],{"class":73},[67,278,112],{"class":111},[67,280,281],{"class":115},"launch",[67,283,88],{"class":111},[67,285,168],{"class":73},[67,287,289,291,294,296,298,300,303],{"class":69,"line":288},9,[67,290,192],{"class":80},[67,292,293],{"class":103},"mainClass",[67,295,88],{"class":80},[67,297,91],{"class":73},[67,299,112],{"class":111},[67,301,302],{"class":115},"net.yuanfen.op.xams.ApplicationKt",[67,304,119],{"class":111},[67,306,308],{"class":69,"line":307},10,[67,309,310],{"class":73},"    }\n",[67,312,314],{"class":69,"line":313},11,[67,315,316],{"class":73},"  ]\n",[67,318,320],{"class":69,"line":319},12,[67,321,131],{"class":73},[27,323,324,325,327,328,331,332,337],{},"另外，",[64,326,51],{}," 插件暂不支持 ",[64,329,330],{},"Gradle Kotlin DSL"," （",[37,333,336],{"href":334,"rel":335},"https:\u002F\u002Fgithub.com\u002FKotlin\u002Fkotlin-lsp\u002Fissues\u002F55",[41],"Issue#55","）。",[27,339,340,341,344,345,344,348,351],{},"尝试了 ",[64,342,343],{},"ktfmt","、",[64,346,347],{},"ktfmt-gradle",[64,349,350],{},"Spotless Gradle"," 等插件，最终都因为各种原因放弃了。",[27,353,354,355,357],{},"另外还遇到一个 ",[64,356,51],{}," 的奇怪 bug，就是插件一直报错和各种警告：",[57,359,363],{"className":360,"code":361,"language":362,"meta":62,"style":62},"language-log shiki shiki-themes material-theme-lighter github-light github-dark","Error while resolving org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl from SEALED_CLASS_INHERITORS to ANNOTATION_ARGUMENTS current declaration phase SEALED_CLASS_INHERITORS origin: Source session: class org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSourcesSession module data: class org.jetbrains.kotlin.analysis.low.level.api.fir.projectStructure.LLFirModuleData KaModule: class org.jetbrains.kotlin.idea.base.fir.projectStructure.modules.source.KaSourceModuleImpl platform: JVM (1.8)\n\n\nWARNING: package sun.awt.windows not in java.desktop\nWARNING: package sun.awt.X11 not in java.desktop\nWARNING: package com.sun.java.swing.plaf.gtk not in java.desktop\nWARNING - #c.i.i.p.PluginManager - Plugin descriptor for plugin 'intellij.kotlin.searching.xml' has declared element 'visibility' which has no effect there\nWARNING - #c.j.l.a.f.i.c.d.i.LSInspectionDiagnosticProviderImpl - org.jetbrains.kotlin.utils.KotlinExceptionWithAttachments: Unable to get element context\n","log",[64,364,365,410,416,420,438,451,464,489],{"__ignoreMap":62},[67,366,367,370,374,377,380,383,386,389,392,395,398,401,404,407],{"class":69,"line":70},[67,368,369],{"class":115},"Error",[67,371,373],{"class":372},"su5hD"," while resolving ",[67,375,376],{"class":80},"org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl",[67,378,379],{"class":372}," from SEALED_CLASS_INHERITORS to ANNOTATION_ARGUMENTS current declaration phase SEALED_CLASS_INHERITORS origin: Source session: class ",[67,381,382],{"class":80},"org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSourcesSession",[67,384,385],{"class":372}," module data: class ",[67,387,388],{"class":80},"org.jetbrains.kotlin.analysis.low.level.api.fir.projectStructure.LLFirModuleData",[67,390,391],{"class":372}," KaModule: class ",[67,393,394],{"class":80},"org.jetbrains.kotlin.idea.base.fir.projectStructure.modules.source.KaSourceModuleImpl",[67,396,397],{"class":372}," platform: JVM (",[67,399,400],{"class":80},"1",[67,402,403],{"class":372},".",[67,405,406],{"class":80},"8",[67,408,409],{"class":372},")\n",[67,411,412],{"class":69,"line":77},[67,413,415],{"emptyLinePlaceholder":414},true,"\n",[67,417,418],{"class":69,"line":97},[67,419,415],{"emptyLinePlaceholder":414},[67,421,422,426,429,432,435],{"class":69,"line":122},[67,423,425],{"class":424},"s2YIT","WARNING",[67,427,428],{"class":372},": package ",[67,430,431],{"class":80},"sun.awt.windows",[67,433,434],{"class":372}," not in ",[67,436,437],{"class":80},"java.desktop\n",[67,439,440,442,444,447,449],{"class":69,"line":128},[67,441,425],{"class":424},[67,443,428],{"class":372},[67,445,446],{"class":80},"sun.awt.X11",[67,448,434],{"class":372},[67,450,437],{"class":80},[67,452,453,455,457,460,462],{"class":69,"line":211},[67,454,425],{"class":424},[67,456,428],{"class":372},[67,458,459],{"class":80},"com.sun.java.swing.plaf.gtk",[67,461,434],{"class":372},[67,463,437],{"class":80},[67,465,466,468,471,474,477,480,483,486],{"class":69,"line":232},[67,467,425],{"class":424},[67,469,470],{"class":372}," - #",[67,472,473],{"class":80},"c.i.i.p.PluginManager",[67,475,476],{"class":372}," - Plugin descriptor for plugin ",[67,478,479],{"class":115},"'intellij.kotlin.searching.xml'",[67,481,482],{"class":372}," has declared element ",[67,484,485],{"class":115},"'visibility'",[67,487,488],{"class":372}," which has no effect there\n",[67,490,491,493,495,498,501,504],{"class":69,"line":267},[67,492,425],{"class":424},[67,494,470],{"class":372},[67,496,497],{"class":80},"c.j.l.a.f.i.c.d.i.LSInspectionDiagnosticProviderImpl",[67,499,500],{"class":372}," - ",[67,502,503],{"class":80},"org.jetbrains.kotlin.utils.KotlinExceptionWithAttachments",[67,505,506],{"class":372},": Unable to get element context\n",[27,508,509],{},"比较了两个文件夹，同样的代码，一个报错，一个不报错，报错的那个文件夹换个名字就好了。怀疑是缓存的问题，困扰了很久，最终找到了缓存位置：",[57,511,516],{"className":512,"code":514,"language":515},[513],"language-text","\u002FUsers\u002Fbean\u002FLibrary\u002FApplication Support\u002FJetBrains\u002Fanalyzer\u002Fworkspaces\u002F\n","text",[64,517,514],{"__ignoreMap":62},[27,519,520],{},"删除该目录下的缓存文件夹，重启 VSCode 后问题解决。",[522,523,524],"style",{},"html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s39Yj, html code.shiki .s39Yj{--shiki-light:#39ADB5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sseR_, html code.shiki .sseR_{--shiki-light:#9C3EDA;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZMiF, html code.shiki .sZMiF{--shiki-light:#E2931D;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s2YIT, html code.shiki .s2YIT{--shiki-light:#E53935;--shiki-default:#B31D28;--shiki-dark:#FDAEB7}",{"title":62,"searchDepth":77,"depth":77,"links":526},[],null,"2026-01-24",false,"md",{},"\u002Fposts\u002F2026\u002Fuse-vscode-for-kotlin",{"text":534,"minutes":535,"time":536,"words":537},"3 min read",2.28,136800,456,{"title":22,"description":29},{"loc":532,"lastmod":528},"posts\u002F2026\u002F20260124.use-vscode-for-kotlin",[542],"技术","GXxZCrPdasr3Za_z0MuP3TOPnJjje6WtlA4J1g6XgRo",[527,545],{"title":546,"path":547,"stem":548,"date":549,"description":550,"children":-1},"2025 年度回顾","\u002Fposts\u002F2026\u002F2025-annual-review","posts\u002F2026\u002F20260109.2025-annual-review","2026-01-09","这篇年度回顾从 4 号就建了文档了，陆续写了点，拖了一周多才写完。直接进入正题，回顾下我的 2025 年。",1777580264167]