IntelliJ与Gradle构建Java项目时连接超时,curl请求正常
排查思路与解决方案
1. 检查JVM代理配置差异
curl默认使用系统代理,但Java程序(包括Gradle/IntelliJ运行的JUnit)可能读取不同的代理配置:
- 查看项目根目录的
gradle.properties,确认是否存在强制设置的代理参数:systemProp.http.proxyHost=xxx systemProp.http.proxyPort=xxx systemProp.https.proxyHost=xxx systemProp.https.proxyPort=xxx - 检查IntelliJ的代理设置:
File > Settings > Appearance & Behavior > System Settings > HTTP Proxy,确保和系统代理一致。 - 临时禁用代理测试,执行Gradle命令时添加参数:
gradle build -Dhttp.proxyHost= -Dhttp.proxyPort= -Dhttps.proxyHost= -Dhttps.proxyPort=
2. 验证DNS解析差异
Java的DNS缓存策略与系统curl可能存在差异,导致解析到不可用的IP:
- 在测试代码中添加日志,打印域名解析结果:
import java.net.InetAddress; // 测试代码中插入 InetAddress[] addresses = InetAddress.getAllByName("{domain}"); for (InetAddress addr : addresses) { System.out.println("Java resolved IP: " + addr.getHostAddress()); } - 和系统解析结果对比(执行
nslookup {domain}),若不一致,刷新Java DNS缓存:java.security.Security.setProperty("networkaddress.cache.ttl", "0");
3. 检查HTTP客户端连接超时参数
Apache HttpClient的连接超时设置可能过短,而curl默认超时更长:
- 查看
SBHttp类中的超时配置,确认connectTimeout是否合理(比如是否小于实际网络连接所需时间):// 示例:调整超时参数测试 RequestConfig config = RequestConfig.custom() .setConnectTimeout(10000) // 临时调至10秒 .setSocketTimeout(10000) .build();
4. 排查网络权限限制
部分环境下,Java进程可能被防火墙/安全软件限制网络访问,而curl不受影响:
- 检查系统防火墙规则,确认Java进程(Gradle启动的JVM、IntelliJ的JVM)是否允许访问目标端口80。
- 编写极简Java测试类,排除业务代码干扰:
执行import java.net.Socket; public class SimpleSocketTest { public static void main(String[] args) { try (Socket socket = new Socket("{domain}", 80)) { System.out.println("Connected successfully"); } catch (Exception e) { e.printStackTrace(); } } }java SimpleSocketTest,验证基础连接是否正常。
5. 检查Hystrix超时配置
报错堆栈包含Hystrix,可能其全局超时覆盖了HTTP客户端设置:
- 查看Hystrix配置,比如
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds,若该值小于HTTP连接所需时间,会提前触发超时。 - 临时针对该命令调整超时,或禁用Hystrix超时测试。
内容的提问来源于stack exchange,提问作者gurdingering
相关产品推荐
相关产品推荐

