在Windows上做Java开发,很多痛点其实都来自系统本身:路径分隔符不统一导致脚本跑不起来、Docker Desktop占用资源偏高、某些依赖库编译时依赖Linux工具链。WSL2的出现让这些问题有了新的解法——你在Windows里得到的是一个真正的Linux内核,而不是一层转译。本文就完整走一遍在WSL2下搭建Java开发环境的过程,包括JDK安装、Maven配置、IDEA联动以及性能优化的关键细节。

一、启用WSL2并选择合适的Linux发行版
WSL2和WSL1有本质区别:WSL1是把Linux系统调用翻译成Windows NT内核调用,兼容性一般;WSL2则是跑在轻量级虚拟机上的真实Linux内核,支持完整的系统调用,Docker、systemd等都能正常工作。做Java开发尤其是要跑容器的场景,必须选WSL2。
启用方式很简单,以管理员身份打开PowerShell,执行以下命令即可完成安装并默认使用WSL2:
wsl --install wsl --set-default-version 2
如果想指定发行版,可以先执行wsl --list --online查看可用列表,再用wsl --install -d Ubuntu-22.04安装。安装完成后第一次启动会要求创建用户名和密码,建议使用普通用户而不是root,日常操作配合sudo即可。
有一个容易被忽略的细节:WSL2的虚拟磁盘默认放在C盘,随着使用时间增长会占用几十GB空间。可以在安装后导出再导入,把发行版迁移到其他盘,例如放到D:\WSL\目录下:
# 在PowerShell中执行,注意路径用的是Windows格式 wsl --export Ubuntu-22.04 D:\WSL\ubuntu.tar wsl --unregister Ubuntu-22.04 wsl --import Ubuntu-22.04 D:\WSL\ubuntu D:\WSL\ubuntu.tar --version 2
导入后的发行版默认以root登录,切换回普通用户可以修改/etc/wsl.conf,添加[user]段并设置default=你的用户名,然后执行wsl --shutdown重启生效。
二、安装OpenJDK与Maven并配置国内镜像
进入Linux环境后,安装JDK推荐直接用发行版自带的包管理器,也可以用SDKMAN统一管理多版本JDK,后者在需要切换JDK 8、17、21的项目里更方便。先看最直接的方式:
sudo apt update sudo apt install openjdk-17-jdk -y java -version
如果项目对JDK版本有多个要求,SDKMAN是更好的选择。它安装在每个用户目录下,不需要root权限,切换版本的原理是修改PATH中的软链接指向:
curl -s "https://get.sdkman.io" | bash source "$HOME/.sdkman/bin/sdkman-init.sh" sdk list java sdk install java 17.0.9-tem sdk install java 8.0.392-tem sdk use java 17.0.9-tem # 当前会话切换 sdk default java 17.0.9-tem # 设为默认
Maven安装后建议立刻配置阿里云镜像,否则拉依赖的速度会让人怀疑人生。编辑~/.m2/settings.xml:
<settings>
<mirrors>
<mirror>
<id>aliyun</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>
</settings>
这里有个取舍要注意:如果团队使用Nexus私服,mirrorOf写成central即可,不要写*,否则私服地址也会被劫持到公共镜像,导致内部组件拉取失败。配置完成后可以执行mvn -v确认版本,并用一个简单项目验证依赖下载速度。
三、IDEA与WSL联动开发及性能优化
JetBrains IDEA对WSL有原生支持,新建或打开项目时选择\\wsl$\Ubuntu-22.04\home\user\project这样的路径,IDEA会自动识别出这是WSL项目,并把JDK、Maven都指向Linux侧的工具链。这样做的好处是:代码补全用的是Windows原生体验,而编译、运行、调试全部发生在Linux环境里,Git的文件权限、换行符行为也和线上服务器一致。
配置JDK时在Project Structure里添加JDK,选择WSL选项,IDEA会自动扫描/usr/lib/jvm和~/.sdkman/candidates/java下的安装。Maven同理,指定Linux侧的Maven home和settings.xml路径即可。运行Spring Boot项目时,日志输出和端口映射都是通的,直接在Windows浏览器访问localhost:8080就能打开。
性能方面有一个必须了解的坑:WSL2访问Windows文件系统(即/mnt/c/下的路径)性能非常差,因为跨了两个文件系统边界,每次IO都有协议转换开销。实测在一个中大型Maven项目上,mvn clean package放在/mnt/c/下执行可能需要几分钟,而放在Linux原生目录~/project下往往几十秒就完成了。结论很明确:项目代码一定要放在Linux文件系统内,也就是用户home目录下,不要图方便放在Windows盘再通过/mnt访问。
如果习惯用Windows侧的资源管理器管理文件,可以在资源管理器地址栏输入\\wsl$\Ubuntu-22.04直接浏览Linux目录,或者在WSL内用explorer.exe .打开当前目录,两边互操作并没有想象中麻烦。
另外可以调整.wslconfig来控制资源占用。该文件位于C:\Users\你的用户名\.wslconfig,内容示例:
[wsl2] memory=8GB processors=4 swap=8GB
修改后同样需要执行wsl --shutdown再重新进入生效。对内存紧张的机器来说,限制WSL2的内存上限能有效避免它把宿主机内存吃满,这是很多人吐槽WSL2吃内存的主要原因,其实一行配置就能解决。
四、常用辅助配置与常见问题
网络方面,WSL2的IP和宿主机是分离的,每次重启IP还会变化。如果需要从Windows访问WSL里的数据库或服务,新版本Windows已经支持localhost自动转发,但反向场景(WSL内访问Windows上的服务)需要拿宿主机IP。可以在~/.bashrc里加一个变量方便使用:
export WIN_HOST=$(grep -m1 nameserver /etc/resolv.conf | awk '{print $2}')
代理场景同理,如果Windows上跑了代理软件,WSL内执行export http_proxy=http://$WIN_HOST:7890即可让curl、git走代理。注意代理软件需要开启允许局域网连接,否则WSL的请求会被拒绝。
再列几个高频问题:一是git status在/mnt/c下极慢,解决办法还是把仓库放进Linux目录;二是换行符问题,建议统一执行git config --global core.autocrlf input;三是 systemctl 服务启动失败,需要在/etc/wsl.conf中加入[boot]段并设置systemd=true。这些都处理完,WSL2里的Java开发体验基本可以做到和一台真正的Linux开发机无异,同时又保留了Windows的桌面生态,鱼和熊掌兼得。