-Djava.net.preferIPv4Stack=true,强制IPv4 协议进行网络通信
报错场景Java启动连接数据库Permission denied: connect DualStackPlainSocketImpl报错解读是 JDK8 IPv6 双栈兼容经典权限报错Windows 默认优先走 IPv6 协议栈去连 IPv4 数据库地址系统安全策略直接拒绝了跨协议出站连接并非数据库服务不可达、账号密码错误常见场景服务器同时开启 IPv4/IPv6Java 默认会优先解析绑定 IPv6导致只能监听[::]:端口外部 IPv4 客户端连不上数据库、Redis、Nacos、MQ 等连接超时、地址解析异常内网环境只配置了 IPv4 DNSIPv6 解析失败部分中间件不兼容 IPv6 监听地址解决方案添加系统全局环境变量重启终端、IDEA、服务后生效变量名JAVA_TOOL_OPTIONS变量值-Djava.net.preferIPv4Stacktrue作用JVM 启动参数强制让 Java 应用优先使用 IPv4 协议进行网络通信禁用默认优先 IPv6 的行为。也可以每个用到的地方单独配置请自行查找配置方法如IDEA 开发环境Run/Debug Configurations → VM options 填入-Djava.net.preferIPv4Stacktrue原理说明Linux、Windows 现代系统默认双栈IPv4IPv6Java 从某个版本开始默认优先 IPv6 地址解析设置该参数后InetAddress.getLocalHost()返回 IPv4 地址服务默认监听0.0.0.0:端口IPv4 通配地址域名解析优先返回 A 记录IPv4不再优先 AAAAIPv6系统全局环境变量优点所有 Java 程序IDEA、Maven、Tomcat、Jar、第三方中间件自动带上该参数不用每个项目单独配置彻底解决本机所有 Java 服务优先 IPv6 导致的内网访问、注册中心、数据库连接异常问题。系统全局环境变量缺点全局生效无法针对某个 Java 进程例外如果以后有应用需要使用 IPv6必须删掉这个环境变量或者在启动命令手动覆盖参数java -Djava.net.preferIPv4Stackfalse -jar xxx.jar必须重启对应应用 / 终端才能加载环境变量已经启动的 Java 进程不会自动生效。重要避坑点不要用普通自定义环境变量比如 JAVA_OPTS自己定义的JAVA_OPTS系统不会自动被 JVM 读取只有JAVA_TOOL_OPTIONS是 JVM 专属全局环境变量才能自动加载。代码里System.setProperty(java.net.preferIPv4Stack,true)依然可能失效 如果网络相关类InetAddress在代码执行前就被类加载器加载代码设置会无效用JAVA_TOOL_OPTIONS方式最稳妥。多个 JVM 参数写法示例JAVA_TOOL_OPTIONS-Djava.net.preferIPv4Stacktrue -Xms512m -Xmx1024m