关于在 wsl 中使用 idea 进行 Java 开发的问题

4 月 7 日
 allyn

由于 ai agent 的缘故,项目不得不迁移到 wsl 内部,但是迁移到 wsl 后问题实在太多了,解决一个又来一个,导致不太有信心使用,有没有好点的解决方案?

问题 1: 使用 intellij idea 启动 java 程序端口占用问题( jmx ),在 wsl 中没有找到到 jmx 占用的端口,但是又说占用了,不知道什么原因,直接暴力关闭 jmx ,解决办法:关闭 jmx

问题 2: 在 wsl 中启动本地端口启动 8888 ,localhost 能访问,局域网不能访问,原因是 wsl 防火墙问题,解决办法:使用 powershell 管理员执行命令

Set-NetFirewallHyperVVMSetting -Name '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -DefaultInboundAction Allow

问题 3: 程序终于启动起来了,结果无法使用 java debug 动态更改代码,也无法进入断点,jrebel 也无法使用。 原因可能是:

java.lang.IllegalAccessException: Class com.intellij.spring.debugger.rt.com.intellij.spring.debugger.rt.SpringBeanDefinitionLoader can not access a member of class org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader$ConfigurationClassBeanDefinition with modifiers "public"
	at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:102)
	at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(AccessibleObject.java:296)
	at java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:288)
	at java.lang.reflect.Method.invoke(Method.java:491)
	at com.intellij.spring.debugger.rt.com.intellij.spring.debugger.rt.SpringBeanDefinitionLoader.getAnnotationMetadataClassName(SpringBeanDefinitionLoader.java:182)
	at com.intellij.spring.debugger.rt.com.intellij.spring.debugger.rt.SpringBeanDefinitionLoader.getBeanClassName(SpringBeanDefinitionLoader.java:121)
	at com.intellij.spring.debugger.rt.com.intellij.spring.debugger.rt.SpringBeanDefinitionLoader.getAllBeanDefinitions(SpringBeanDefinitionLoader.java:40)
	at org.springframework.context.event.ContextRefreshedEvent.<init>(ContextRefreshedEvent.java:37)
	at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:938)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:586)
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754)
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:434)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:338)

这个到目前为止还没有解决。

综上所述,wsl 开发 java 程序实在是太难了,解决一个又来一个,上面的问题大家有什么解决方法吗?

4527 次点击
所在节点    Java
29 条回复
xubeiyou
4 月 7 日
暂时是 wsl 使用 cli 开发本地的 然后本地联调
redbule
4 月 7 日
使用 wsl2 ,使用 wsl2 的镜像模式(和主机共享端口)
Windows 下请使用 powershell7
VoiceEXONE
4 月 7 日
目前没有发现 AICoding CLI 对 Java 支持友好的
sunpj
4 月 7 日
你在启动项里面加 -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=127.0.0.1:5005 然后在远程 jvm 调试 加 -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 我现在新公司只能用 windows 所以基本完整的搞了 idea+wsl2 的开发 实际上用 vscode 配置调试会方便很多 就是 vscode 开发 java 作为 ide 还是弱了点 作为 ai 的载具还是 key 的
gwkoooo
4 月 7 日
我在用 copilot cli 用的 shell7 没发现什么问题
jianguyuxing123
4 月 11 日
我这两天项目迁移到 wsl2 也遇到了问题 3 。idea2026.1 上,用普通 debug (不带 jrebel 开头的)运行时是可以停在断点的,但无法热加载

用了 jrebel debug ,断点无法停留,也无法热加载。
jrebel 这块我已经试了本地模式及远程 jrebel 两种,包括启动参数加远程 jrebel agent 路径啥的都没用。
rebel.xml 里配置了 wsl2 项目路径,idea 底部一直显示 “Initializing filesystem listener for 项目名”。
感觉 jrebel 和 idea 对 wsl2 支持还是有问题。
jianguyuxing123
4 月 12 日
问题 3 找到解法了,针对本机 wsl 的方法,推测应该远程其他机器的 wsl 效果一样。

解决方法:1. 打开一个本地 win 原生项目的 idea ,到"设置" -> "高级设置"中搜索 wsl ,把"将 wsl 项目作为本地项目原生打开(无需使用远程开发功能)"前面的勾去掉。


2. 然后如果要用 jrebel 的话,注意 jrebel 插件要选择安装到主机(如果是用离线插件包安装)

2.1 jrebel 安装到客户机也是可以的,只不过启动时需要在 debug 配置的 jvm 参数中加上远程主机的 jrebel 包,并且启动的时候要用普通 debug 启动。效果和 2 一样,只不过我想试一下之前的两种方式是否都正常。

解释下:idea 远程开发选择本机 wsl 时,默认并不走远程方式,打开新的 wsl 项目,他会提示你默认走原生 wsl 集成。目前这种方式 idea 的原生 debug (无法热加载)和 jrebel (断点和热加载都无效)都无法很好支持。

但是走远程方式打开,目前实测原生 debug 正常,jrebel 能正常对类和 mybatis 的 xml 热加载和断点。

不过远程方式打开,他会在你的 wsl 中下载 idea 后端,会用 jetbrain gateway 打开。从本地 idea 打开瘦客户端 idea 的过程要慢很多(如果瘦客户端已启动,打开同一个 wsl 中项目建议用瘦客户端打开,否则每次都要执行首次打开瘦客户端的流程)。

但启动项目的时候,普通 debug 模式和原生 wsl 启动差不太多,jrebel 启动比原生 wsl 启动慢一倍。但都快于 windows 原生项目的启动
Plutooo
5 月 22 日
我是因为 wsl 文件性能有问题,直接转 Linux 了,目前用了 3 个月已经不想回去 Windows 了
Essaim
7 月 28 日
搜到这里备注一下以便后续大家排查,问题 1: [idea 官方 youtrack]( https://youtrack.jetbrains.com/projects/IJPL/issues/IJPL-232215/Enabled-WSL2-Mirrored-Networking-causes-JMX-port-conflict-due-to-port-forwarding)
问题已经在 2026.2 中修复,试了下也可以了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.ih06.com/t/1203944

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX