The issue with the standard Jersey 2.x proxy configuration is it doesn't allow nonProxyHosts option.
It doesn't allow to separate http and https calls too, but these limitations were ok for me.
To be able to reuse the JVM proxy properties (-Dhttp.proxyHost, ...) instead of specifying dedicated Jersey params, you can register a specific Jersey config's connector (regarding to the previous answers, it may or may not have been out of the box in the past, but it isn't on the current 2.30 jersey version):
In maven3 pom.xml:
<properties>
<jersey.version>2.30.1</jersey.version>
</properties>
<dependency>
<groupId>org.glassfish.jersey.connectors</groupId>
<artifactId>jersey-apache-connector</artifactId>
<version>${jersey.version}</version>
</dependency>
In your Jersey code:
- add the
ApacheConnectorProvider
- register a new
ApacheHttpClientBuilderConfigurator
which set the .useSystemProperties()
flag on the underlying HttpClient's client
ClientConfig config = new ClientConfig()
// Apache connector to active the proxy settings
// EDIT: comment this line as it seems to be useless when using ApacheHttpClientBuilderConfigurator (below) and it provokes random hangs
//.connectorProvider(new ApacheConnectorProvider())
// Register specific features and black-magic Jersey behaviors
//.register(Xxxx.class)
//.register(Yyyy.class)
// By registering this magic lambda (Found after debugging both Jersey and HttpClient)
// We fallback on the regular JVM proxy settings properties, and avoid the restricted
// jersey properties.
//
// Jersey proxy properties are restrictive because they ignore nonProxyHosts.
// Jersey properties:
// .property(ClientProperties.PROXY_URI, "http://host:port")
// .property(ClientProperties.PROXY_USERNAME, "myProxyUser")
// .property(ClientProperties.PROXY_PASSWORD, "myProxyPassword")
//
// To be able to take into account regular JVM proxy properties:
// For HTTP: -Dhttp.proxyHost=http.proxy.example.com -Dhttp.proxyPort=10080
// For HTTPS: -Dhttps.proxyHost=https.proxy.example.com -Dhttps.proxyPort=10443
// Common for BOTH http and https: -Dhttp.nonProxyHosts=foo.example.com|bar.example.com|*baz.example.com
// Auth NTLM: -Dhttp.proxyUser=MyDomain/username or -Dhttp.auth.ntlm.domain=MyDomain
// Auth Basic: -Dhttp.proxyUser=username or -Dhttp.proxyPassword=password
.register(
((ApacheHttpClientBuilderConfigurator)
httpClientBuilder -> {
RequestConfig requestConfig =
RequestConfig.custom()
.setConnectTimeout(5000)
.setConnectionRequestTimeout(5000)
.setSocketTimeout(5000)
.build();
httpClientBuilder.setDefaultRequestConfig(requestConfig);
httpClientBuilder.useSystemProperties();
return httpClientBuilder;
}))
// Register other properties
//.property(ClientProperties.CONNECT_TIMEOUT, 5000)
//.property(ClientProperties.READ_TIMEOUT, 5000)
//.property(HttpUrlConnectorProvider.SET_METHOD_WORKAROUND, true);
ClientProperties.PROXY_URI
starts withhttp://
– Fassold