@@ -32,7 +32,7 @@ Consult your IDE documentation for IDE-specific information upon proxy setup.
<p>
All tasks running in Ant's JVM share the same HTTP/FTP/Socks
All tasks and threads running in Ant's JVM share the same HTTP/FTP/Socks
proxy configuration.
</p>
@@ -71,33 +71,66 @@ proxy configuration.
<p>
This property maybe enough to give command-line Ant
builds network access, although in practise the results
are somewhat disappointing .
are inconsistent .
</p>
<p>
We are not entirely sure where it reads the property settings from.
For windows, it probably reads the appropriate bits of the registry. For
Unix/Linux it may use the current Gnome2 settings.
It is has also been reported a breaking the IBM Java 5 JRE on AIX,
and does not always work on Linux (presumably due to missing gconf settings)
Other odd things can go wrong, like Oracle JDBC drivers or pure Java SVN clients.
</p>
<p>
One limitation of this feature, other than requiring a 1.5+ JVM,
is that it is not dynamic. A long-lasting build hosted on a laptop will
not adapt to changes in proxy settings .
To make the <code>-autoproxy</code> option the default, add it to the environment variable
<code>ANT_ARGS</code>, which contains a list of arguments to pass to Ant on every
command line run .
</p>
<h4>How Autoproxy works</h4>
<p>
We are grateful for some input from Sun as to how the proxy code works under
Java 1.5 and up. The <code>java.net.useSystemProxies</code> is checked only
once, at startup time, the other checks (registry, gconf, system properties) are done
dynamically whenever needed (socket connection, URL connection etc..).
</p>
<h5>Windows</h5>
<p>
It is has also been reported a breaking the IBM Java 5 JRE on AIX,
and does not appear to work reliably on Linux.
Other odd things can go wrong, like Oracle JDBC drivers or pure Java SVN clients.
The JVM goes straight to the registry, bypassing WinInet, as it is not
present/consistent on all supported Windows platforms (it is part of IE,
really). Java 7 may use the Windows APIs on the platforms when it is present .
</p>
<h5>Linux</h5>
<p>
To make the <code>-autproxy</code> option the default, add it to the environment variable
<code>ANT_ARGS</code>, which contains a list of arguments to pass to Ant on every
command line run.
The JVM uses the gconf library to look at specific entries.
The GConf-2 settings used are:
</p>
<pre>
- /system/http_proxy/use_http_proxy boolean
- /system/http_proxy/use_authentication boolean
- /system/http_proxy/host string
- /system/http_proxy/authentication_user string
- /system/http_proxy/authentication_password string
- /system/http_proxy/port int
- /system/proxy/socks_host string
- /system/proxy/mode string
- /system/proxy/ftp_host string
- /system/proxy/secure_host string
- /system/proxy/socks_port int
- /system/proxy/ftp_port int
- /system/proxy/secure_port int
- /system/proxy/no_proxy_for list
- /system/proxy/gopher_host string
- /system/proxy/gopher_port int
</pre>
<p>
If you are using KDE or another GUI than Gnome, you can still use the
<code>gconf-editor</code> tool to add these entries.
</p>
<h3>JVM options</h3>
<h3>Manual JVM options</h3>
<p>
Any JVM can have its proxy options explicitly configured by passing
the appropriate <code>-D</code> system property options to the runtime.
@@ -116,8 +149,13 @@ proxy configuration.
setenv ANT_OPTS "-Dhttp.proxyHost=proxy -Dhttp.proxyPort=8080"
</pre>
<p>
For Windows, set the ANT_OPTS environment variable in the appropriate "MyComputer"
properties dialog box.
If you insert this line into the Ant shell script itself, it gets picked up
by all continuous integration tools running on the system that call Ant via the
command line.
</p>
<p>
For Windows, set the <code>ANT_OPTS</code> environment variable in the appropriate "My Computer"
properties dialog box (winXP), "Computer" properties (Vista)
</p>
<p>
This mechanism works across Java versions, is cross-platform and reliable.
@@ -133,6 +171,7 @@ proxy configuration.
<li>Not dynamic enough to deal with laptop configuration changes.</li>
</ol>
<h3>SetProxy Task</h3>
<p>
The <a href="OptionalTasks/setproxy.html">setproxy task</a> can be used to
@@ -174,16 +213,73 @@ proxy configuration.
</target>
</pre>
<h3>Custom ProxySelector implementations</h3>
<p>
As Java lets developers write their own ProxySelector implementations, it
is theoretically possible for someone to write their own proxy selector class that uses
different policies to determine proxy settings. There is no explicit support
for this in Ant, and it has not, to the team's knowledge, been attempted.
</p>
<p>
This could be the most flexible of solutions, as one could easily imagine
an Ant-specific proxy selector that was driven off ant properties, rather
than system properties. Developers could set proxy options in their
custom build.properties files, and have this propagate.
</p>
<p>
One issue here is with concurrency: the default proxy selector is per-JVM,
not per-thread, and so the proxy settings will apply to all sockets opened
on all threads; we also have the problem of how to propagate options from
one build to the JVM-wide selector.
</p>
<h3>Configuring the Proxy settings of Java programs under Ant</h3>
<p>
Any program that is executed with <code><java></code> without setting
<code>fork="true"</code> will pick up the Ant's settings. If you need
different values, set <code>fork="false"</code> and provide the values
in <code><sysproperty></code> elements.
</p>
If you wish to have
a forked process pick up the Ant's settings, use the
<a href="CoreTypes/propertyset.html"><code><syspropertyset></code></a>
element to propagate the normal proxy settings. The following propertyset
is a datatype which can be referenced in a <code><java></code> task to
pass down the current values.
</p>
<pre>
<propertyset id="proxy.properties">
<propertyref prefix="java.net.useSystemProxies"/>
<propertyref prefix="http."/>
<propertyref prefix="https."/>
<propertyref prefix="ftp."/>
<propertyref prefix="socksProxy"/>
</propertyset>
</pre>
<h3>Summary and conclusions</h3>
<p>
There are three ways to set up proxies in Ant.
There are four ways to set up proxies in Ant.
</p>
<ol>
<li>With Ant1.7 using the <code>-autoproxy</code> parameter.</li>
<li>With Ant1.7 and Java 1.5+ using the <code>-autoproxy</code> parameter.</li>
<li>Via JVM system properties -set these in the ANT_ARGS environment variable.</li>
<li>Via the <setproxy> task.</li>
<li>Custom ProxySelector implementations</li>
</ol>
<p>
Proxy settings are automatically shared with Java programs started under Ant <i>
that are not forked</i>; to pass proxy settings down to subsidiary programs, use
a propertyset.
</p>
<p>
Over time, we expect the Java 5+ proxy features to stabilize, and for Java code
to adapt to them. However, given the fact that it currently does break some
builds, it will be some time before Ant enables the automatic proxy feature by
default. Until then, you have to enable the <code>-autoproxy</code> option or
use one of the alternate mechanisms to configure the JVM.
<h4>Further reading</h4>