配置Maven项目通过代理访问及应用程序代理配置方法咨询
嗨,这个问题我碰到过好多次了!Eclipse和Maven的代理配置是给IDE和构建工具本身用的,和你运行的应用程序的网络代理是完全独立的两套配置,所以得单独给应用做针对性设置。下面分几种常见场景给你解决方案:
通过JVM启动参数配置(最推荐)
直接在启动应用时给JVM传递代理参数,不用改代码,灵活度高。参数示例如下:-Dhttp.proxyHost=你的代理IP或域名 -Dhttp.proxyPort=代理端口号 -Dhttps.proxyHost=你的代理IP或域名 -Dhttps.proxyPort=代理端口号 # 如果代理需要账号密码,追加这几项 -Dhttp.proxyUser=你的代理用户名 -Dhttp.proxyPassword=你的代理密码 -Dhttps.proxyUser=你的代理用户名 -Dhttps.proxyPassword=你的代理密码 # 内部地址不需要走代理的话,用竖线分隔添加排除规则 -Dhttp.nonProxyHosts=localhost|127.0.0.1|*.your-internal-domain.com在Eclipse里操作的话:右键项目 →
Run As→Run Configurations→ 找到对应的Java Application配置 → 切换到Arguments标签页,把上面的参数粘贴到VM arguments输入框里即可。在代码中设置系统属性
如果你不想每次启动都手动加参数,可以在应用的入口类(比如包含main方法的类)最开头添加这段代码,确保它在所有网络请求之前执行:public static void main(String[] args) { // 先设置代理属性 System.setProperty("http.proxyHost", "你的代理IP或域名"); System.setProperty("http.proxyPort", "代理端口号"); System.setProperty("https.proxyHost", "你的代理IP或域名"); System.setProperty("https.proxyPort", "代理端口号"); // 有账号密码的话添加下面两行 System.setProperty("http.proxyUser", "你的代理用户名"); System.setProperty("http.proxyPassword", "你的代理密码"); // 排除不需要代理的地址 System.setProperty("http.nonProxyHosts", "localhost|127.0.0.1|*.your-internal-domain.com"); // 再执行应用的其他逻辑 // ... }使用外部属性文件加载
如果是打包好的JAR包,可以创建一个proxy.properties文件,内容如下:http.proxyHost=你的代理IP或域名 http.proxyPort=代理端口号 https.proxyHost=你的代理IP或域名 https.proxyPort=代理端口号 # 可选的账号密码和排除规则 http.proxyUser=你的代理用户名 http.proxyPassword=你的代理密码 http.nonProxyHosts=localhost|127.0.0.1|*.your-internal-domain.com然后启动JAR时加上参数:
java -Djava.util.properties.load=proxy.properties -jar 你的应用.jar
Spring Boot应用除了支持上面的JVM参数和代码设置方式,还可以通过配置文件或自定义Bean来更优雅地配置:
通过application.properties/yaml配置
如果你的应用用了Spring Cloud Gateway或者默认的HTTP客户端,可以直接在application.properties里添加:# HTTP代理配置 spring.cloud.gateway.httpclient.proxy.host=你的代理IP或域名 spring.cloud.gateway.httpclient.proxy.port=代理端口号 # 代理需要认证的话 spring.cloud.gateway.httpclient.proxy.username=你的代理用户名 spring.cloud.gateway.httpclient.proxy.password=你的代理密码自定义RestTemplate/WebClient代理
如果你是自己创建RestTemplate实例,可以直接在Bean里配置代理:@Bean public RestTemplate restTemplate() { SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); // 设置代理地址和端口 Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("你的代理IP或域名", 代理端口号)); factory.setProxy(proxy); // 如果需要代理认证 BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider(); credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("你的代理用户名", "你的代理密码")); factory.setCredentialsProvider(credentialsProvider); return new RestTemplate(factory); }
如果你的应用用了非JDK自带的HTTP客户端,需要单独给这些客户端配置代理:
OkHttp示例
OkHttpClient client = new OkHttpClient.Builder() .proxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress("你的代理IP或域名", 代理端口号))) // 代理认证逻辑 .proxyAuthenticator((route, response) -> { String credential = Credentials.basic("你的代理用户名", "你的代理密码"); return response.request().newBuilder() .header("Proxy-Authorization", credential) .build(); }) .build();Apache HttpClient示例
HttpHost proxy = new HttpHost("你的代理IP或域名", 代理端口号, "http"); CredentialsProvider credsProvider = new BasicCredentialsProvider(); credsProvider.setCredentials( new AuthScope(proxy.getHostName(), proxy.getPort()), new UsernamePasswordCredentials("你的代理用户名", "你的代理密码")); CloseableHttpClient client = HttpClientBuilder.create() .setProxy(proxy) .setDefaultCredentialsProvider(credsProvider) .build();
这些方案基本覆盖了绝大多数Java应用的代理配置场景,你可以根据自己的应用类型选择最合适的方式。
内容的提问来源于stack exchange,提问作者Adsy1944

