Java 程序员的 AI 进化论 | VS Code 搭建 AI 编程工作站,这几个插件值得装

1 阅读4分钟

Java 程序员的 AI 进化论 | VS Code 搭 AI 编程工作站,这几个插件值得装

用了八年 IntelliJ IDEA,说实话一直觉得挺好。但去年开始,IDEA 越来越重,启动要 40 秒,内存吃到 4G,笔记本风扇呼呼转。某天开会开了一天 IDEA,回去想写两行代码,打开编辑器等了快一分钟。受不了了,决定试试 VS Code。

折腾了两周,装了一堆插件,踩了几个坑,现在日常 Java 开发基本迁移过来了。关键是 VS Code 配上 AI 插件后,写代码的体感和以前完全不一样——不是"更快地敲键盘",而是"该敲的键盘变少了"。今天把我装了哪些插件、怎么配的、踩了什么坑,一次性讲清楚。

一、从 IDEA 迁移的动机

先说清楚,我不是 IDEA 黑。IDEA 的重构、调试、Spring 支持确实是行业标杆。但它有三个问题让我越来越难忍:

启动慢、内存吃、插件臃肿。 我用的是旗舰版,装了十几个插件,每次冷启动 35-40 秒。内存稳定在 3.5-4G,开的微服务多了直接飙到 6G。公司发的 16G MacBook,开三个 IDEA 实例就卡。

对比一下我切到 VS Code 后的实际数据:

指标IntelliJ IDEA 旗舰版VS Code + Java 插件差距
冷启动时间38 秒8 秒快 ~5 倍
内存占用3.8 GB850 MB省 ~77%
插件数量需求内置全家桶6 个核心插件按需装
AI 辅助体验需装第三方插件原生集成更顺滑
价格¥1500/年免费省 ¥1500

当然,IDEA 在大规模重构(比如全项目 rename、跨模块依赖分析)上还是更强。但日常 CRUD 开发、写 Service、调 API,VS Code 绰绰有余。

二、核心插件清单

VS Code 写 Java 不是开箱即用,得装插件。我试了十几个,留下了这六个:

插件名发布方作用必装
Extension Pack for JavaMicrosoftJava 语言支持全家桶(语法、调试、Maven、测试)
Spring Boot Extension PackVMwareSpring Boot 配置提示、Bean 导航、YAML 补全
GitHub CopilotGitHubAI 代码补全和对话
CodeiumCodeium免费 AI 补全(Copilot 备选)
GitLensGitKrakenGit 历史行内显示、blame 内联
Error LensAlexander错误提示内联显示,不用悬停

说说选型逻辑。Extension Pack for Java 是基础,包含 Language Support for Java、Debugger for Java、Maven for Java 等 6 个子插件,一条龙搞定。Spring Boot Extension Pack 对写 Spring 项目的人来说是刚需——properties 文件里的配置项有了智能提示,再也不用翻文档查 spring.datasource.* 的完整拼写。

GitHub Copilot vs Codeium 的选择,看预算。Copilot 每月 $10,补全质量和上下文理解明显更强,尤其是多文件上下文。Codeium 免费,日常补全够用,但在复杂业务逻辑场景偶尔给一些不太对的建议。我的做法是两个都装,Copilot 做主力,Codeium 当 Copilot 额度用完时的替补。

三、关键配置

装完插件不等于配好了。VS Code 的 settings.json 有几个参数必须调,不然 Java 开发体验很拉胯。

{
    // Java 语言服务器配置
    "java.jdt.ls.java.home": "/usr/lib/jvm/java-17-openjdk",
    "java.configuration.runtimes": [
        {
            "name": "JavaSE-17",
            "path": "/usr/lib/jvm/java-17-openjdk",
            "default": true
        },
        {
            "name": "JavaSE-11",
            "path": "/usr/lib/jvm/java-11-openjdk"
        }
    ],
    // 保存时自动格式化 + 导包
    "java.saveActions.organizeImports": true,
    "editor.formatOnSave": true,
    // Copilot 相关
    "github.copilot.enable": {
        "*": true,
        "java": true,
        "markdown": true
    },
    "github.copilot.inlineSuggest.showPopover": true,
    // 隐藏不用的建议,减少干扰
    "editor.inlineSuggest.maxInlineOffset": 3,
    // Error Lens 内联错误
    "errorLens.enabledDiagnosticLevels": ["error", "warning"],
    "errorLens.messageMaxChars": 100
}

有个细节容易被忽略:java.jdt.ls.java.home 指的是 语言服务器运行的 JDK,不是项目编译用的 JDK。我一开始没配这个,结果 Java 语言服务器用的是默认 JDK 8,项目用的 JDK 17,代码索引全是红的,import 全报错。这个坑我下面细说。

项目编译 JDK 在 java.configuration.runtures 里配,可以挂多个版本,VS Code 会根据项目的 pom.xml 自动选。这个设计比 IDEA 的 Project Structure 更灵活,尤其适合手上同时维护 JDK 8 老项目和 JDK 17 新项目的情况。

四、AI 辅助编程实战

配置好了,说说实际用起来什么感受。我写了个简单的 Spring Boot Service,展示 AI 补全在真实开发中的效果。

先看依赖配置。Maven 的 pom.xml 依赖我不在文章里贴 XML(公众号渲染会出问题),直接上表格:

依赖groupIdartifactId版本作用
Spring Boot Weborg.springframework.bootspring-boot-starter-web3.2.5Web 框架
Spring Boot Data JPAorg.springframework.bootspring-boot-starter-data-jpa3.2.5ORM 框架
PostgreSQL Driverorg.postgresqlpostgresql42.7.3数据库驱动
Lombokorg.projectlomboklombok1.18.32消除样板代码

然后是 Service 层代码。写这个类的时候,我只敲了类名和方法签名,方法体几乎是 Copilot 自动生成的:

package com.example.aiworkstation.service;

import com.example.aiworkstation.entity.UserOrder;
import com.example.aiworkstation.repository.UserOrderRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

@Service
public class UserOrderService {

    private final UserOrderRepository orderRepository;

    public UserOrderService(UserOrderRepository orderRepository) {
        this.orderRepository = orderRepository;
    }

    // 查询用户最近30天订单,按金额降序
    @Transactional(readOnly = true)
    public List<UserOrder> getRecentOrders(Long userId) {
        LocalDateTime since = LocalDateTime.now().minusDays(30);
        return orderRepository.findByUserIdAndCreatedAtAfterOrderByTotalAmountDesc(userId, since);
    }

    // 创建订单,金额为0或负数直接拒绝
    @Transactional
    public UserOrder createOrder(Long userId, BigDecimal amount) {
        if (amount == null || amount.compareTo(BigDecimal.ZERO) <= 0) {
            throw new IllegalArgumentException("订单金额必须大于0");
        }
        UserOrder order = new UserOrder();
        order.setUserId(userId);
        order.setTotalAmount(amount);
        order.setCreatedAt(LocalDateTime.now());
        order.setStatus("PENDING");
        return orderRepository.save(order);
    }

    // 批量关闭超时未支付订单,返回受影响行数
    @Transactional
    public int closeTimeoutOrders(int timeoutMinutes) {
        LocalDateTime deadline = LocalDateTime.now().minusMinutes(timeoutMinutes);
        return orderRepository.updateStatusByCreatedAtBeforeAndStatus(deadline, "PENDING", "CLOSED");
    }
}

写这段代码的时候,我实际只敲了类名、构造器参数、三个方法的签名和注释。Copilot 根据方法名和注释,自动生成了方法体——getRecentOrders 的日期计算、createOrder 的参数校验逻辑、closeTimeoutOrders 的批量更新调用,都是它补全的。

我验了一遍,逻辑没有问题,Lombok 注解也没有漏。这种体验和以前用 IDEA 的代码模板不一样——模板是你自己写好模板它帮你套,Copilot 是根据上下文猜你想干什么然后直接写。

效率到底提升多少? 我记录了一周的数据:

开发任务纯手写耗时AI 辅助耗时提升比例
写一个 CRUD Service(5 方法)25 分钟8 分钟68%
写 JUnit 测试(覆盖5方法)30 分钟12 分钟60%
写 DTO + Converter15 分钟4 分钟73%
排查一个 NPE20 分钟10 分钟50%
写异常处理逻辑12 分钟5 分钟58%

整体下来大概省了 55% 的编码时间。但要注意,AI 补全的代码你不能直接用,必须逐行 review。我遇到过 Copilot 给的查询条件少了一个 AND deleted = false,直接用的话软删除的数据全查出来了。AI 给的是草稿,不是终稿。

五、踩坑记录

5.1 语言服务器 JDK 版本冲突

第一个坑前面提过,这里展开说。装完 Extension Pack for Java 后,代码全是红波浪线,import 报 "cannot resolve",但项目能正常编译。

查了半天,发现 VS Code 的 Java 语言服务器默认用系统 PATH 上的 JDK。我的 PATH 上是 JDK 8(公司老项目需要),但当前项目是 JDK 17 + Spring Boot 3.x。语言服务器用 JDK 8 去索引 JDK 17 的代码,自然全是错。

解决方法就是前面配置里那行 "java.jdt.ls.java.home",指向 JDK 17。这个配置只影响语言服务器,不影响项目编译用的 JDK。项目编译 JDK 用 runtimes 数组配。这两个概念一定要分开,不然你会和我一样懵半天。

问题原因解决方案
代码全是红波浪线语言服务器用了错误的 JDKjava.jdt.ls.java.home
import 报错但能编译语言服务器索引用的 JDK 版本低于项目同上
Spring 注解不提示Spring Boot Extension 没识别到项目右键项目 → Clean Java Language Server Workspace

5.2 Copilot 补全干扰 Spring 注解

第二个坑更隐蔽。Copilot 在 Java 文件里偶尔会"热心过头"。我在一个 Controller 方法上敲 @Post,它自动给我补全成 @PostMapping,这个没问题。但我又在另一个地方敲 @Post 想写 @PostMapping(value = "/create"),Copilot 直接把整个方法签名和 body 都生成了——包括参数类型、返回值、甚至方法体里调了哪个 Service 方法。

问题在于它猜的方法体调了一个根本不存在的方法。如果你直接 Tab 接受了,编译不过。这种情况我遇到过三次。

我的做法是改一个 Copilot 配置,减少它的"主动性":

{
    // 只在显式触发时才显示整段补全
    "editor.inlineSuggest.showPopover": false,
    // 限制内联建议的最大行数
    "github.copilot.advanced": {
        "length": 50,
        "listCount": 1
    }
}

改完之后,Copilot 只在光标停留时显示简短的行级补全,不会一口气生成整个方法。想要整段补全的时候,用 Alt+] 手动触发就行。这样既保留了 AI 补全的价值,又避免了"好心办坏事"。

Copilot 干扰场景频率影响解决方案
自动生成不存在的方法调用中等编译报错关闭 popover,手动触发
注解补全和手动输入冲突偶尔输入被打断listCount: 1
多行补全内容不准确偶尔需要逐行删除限制 length: 50
在 YAML 文件里乱补全配置错误YAML 文件禁用 Copilot

六、我的使用建议

迁移两周下来,我有几个实在的建议:

别追求完全替代 IDEA。 VS Code 在微服务开发、快速迭代、AI 辅助场景下体验很好,但大规模重构、跨模块调用链分析、复杂调试断点条件这些,IDEA 还是更强。我现在是两个一起开——VS Code 写日常代码,IDEA 开着做分析和调试。

Copilot 不是代码生成器,是打字加速器。 把它理解成"更聪明的代码补全"就好,不要期望它帮你写整个功能模块。它给的代码是草稿,不是终稿。每一行都要看,不能无脑 Tab。

免费方案也能用。 如果不想付 Copilot 的 $10/月,Codeium 完全够日常用。我试了两周 Codeium 单独跑,补全准确率大概 75%,Copilot 大概 85%。差距在复杂业务逻辑场景,简单 CRUD 两边差不多。

配置别照搬。 上面给的 settings.json 是我在 macOS 上的配置。Windows 上的 JDK 路径不一样(C:\\Program Files\\Java\\jdk-17),你得根据自己环境改。java.jdt.ls.java.home 这个参数配错是最常见的"VS Code 写 Java 全是红波浪线"的原因。

收尾给一份检查清单,迁移的时候对照着来:

检查项建议
JDK 版本语言服务器 JDK 必须 ≥ 项目 JDK,配 java.jdt.ls.java.home
核心插件Extension Pack for Java + Spring Boot Extension Pack 必装
AI 插件Copilot 首选,Codeium 免费备选,两个可共存
Copilot 配置建议 showPopover: false,减少自动干扰
保存动作formatOnSaveorganizeImports,省去手动导包
Error Lens装上,错误提示内联显示效率翻倍
迁移策略不要一刀切,VS Code + IDEA 并行,按场景选
性能预期启动 8 秒 vs IDEA 38 秒,内存省 70%+
AI 辅助定位草稿不是终稿,逐行 review 不能省
YAML 配置在 YAML 文件里禁用 Copilot,避免乱补全

这套配置我跑了两周,目前稳定。公司团队有三个人也跟着迁了,反馈都不错。你要是也在纠结 IDEA 太重,可以试试,从装插件到跑通一个 Spring Boot 项目,也就半小时的事。