Proxy Configuration

This page discussing proxy issues on command-line ant. Consult your IDE documentation for IDE-specific information upon proxy setup.

All tasks running in Ant's JVM share the same HTTP/FTP/Socks proxy configuration.

When any task tries to retrieve content from an HTTP page, including the <get> task, any automated URL retrieval in an XML/XSL task, or any third-party task that uses the java.net.URL classes, the proxy settings may make the difference between success and failure.

Anyone authoring a build file behind a blocking firewall will immediately appreciate the problems and may want to write a build file to deal with the problem, but users of third party build build files may find that the build file itself does not work behind the firewall.

This is a long standing problem with Java and Ant. The only way to fix it is to explictly configure Ant with the proxy settings, either by passing down the proxy details as JVM properties, or to tell Ant on a Java1.5+ system to have the JVM work it out for itself.

Java1.5+ proxy support (new for Ant1.7)

When Ant starts up, if the -autoproxy command is supplied, Ant sets the java.net.useSystemProxies system property. This tells a Java1.5+ JVM to use the current set of property settings of the host environment. Other JVMs, such as the Kaffe and Apache Harmony runtimes, may also use this property in future. It is ignored on the Java1.4 and earlier runtimes.

This property maybe enough to give command-line Ant builds network access, although in practise the results are somewhat disappointing.

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.

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.

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.

To make the -autproxy option the default, add it to the environment variable ANT_ARGS, which contains a list of arguments to pass to Ant on every command line run.

JVM options

Any JVM can have its proxy options explicitly configured by passing the appropriate -D system property options to the runtime. Ant can be configured through all its shell scripts via the ANT_OPTS environment variable, which is a list of options to supply to Ant's JVM:

For bash:

    export ANT_OPTS="-Dhttp.proxyHost=proxy -Dhttp.proxyPort=8080"
For csh/tcsh:
    setenv ANT_OPTS "-Dhttp.proxyHost=proxy -Dhttp.proxyPort=8080"

For Windows, set the ANT_OPTS environment variable in the appropriate "MyComputer" properties dialog box.

This mechanism works across Java versions, is cross-platform and reliable. Once set, all build files run via the command line will automatically have their proxy setup correctly, without needing any build file changes. It also apparently overrides Ant's automatic proxy settings options.

It is limited in the following ways:

  1. Does not work under IDEs. These need their own proxy settings changed
  2. Not dynamic enough to deal with laptop configuration changes.

SetProxy Task

The setproxy task can be used to explicitly set a proxy in a build file. This manipulates the many proxy configuration properties of a JVM, and controls the proxy settings for all network operations in the same JVM from that moment.

If you have a build file that is only to be used in-house, behind a firewall, on an older JVM, and you cannot change Ant's JVM proxy settings, then this is your best option. It is ugly and brittle, because the build file now contains system configuration information. It is also hard to get this right across the many possible proxy options of different users (none, HTTP, SOCKS).

Note that proxy configurations set with this task will probably override any set by other mechanisms. It can also be used with fancy tricks to only set a proxy if the proxy is considered reachable:

  <target name="probe-proxy" depends="init">
    <condition property="proxy.enabled">
      <and>
        <isset property="proxy.host"/>
        <isreachable host="${proxy.host}"/>
      </and>
    </condition>
  </target>

  <target name="proxy" depends="probe-proxy" if="proxy.enabled">
    <property name="proxy.port" value="80"/>
    <property name="proxy.user" value=""/>
    <property name="proxy.pass" value=""/>
    <setproxy proxyhost="${proxy.host}" proxyport="${proxy.port}"
      proxyuser="${proxy.user}" proxypassword="${proxy.pass}"/>
  </target>

Summary and conclusions

There are three ways to set up proxies in Ant.

  1. With Ant1.7 using the -autoproxy parameter.
  2. Via JVM system properties -set these in the ANT_ARGS environment variable.
  3. Via the <setproxy> task.

Further reading