This page discussing proxy issues on command-line Apache Ant. Consult your IDE documentation for IDE-specific information upon proxy setup.
All tasks and threads 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 explicitly configure Ant with the proxy settings, either by passing down the proxy details as JVM properties, or to tell Ant on a Java 5+ system to have the JVM work it out for itself.
Since Ant 1.7
When Ant starts up, if the -autoproxy command is
supplied, Ant sets the java.net.useSystemProxies
system
property. This tells a Java 5+ runtime to use the current set of
property settings of the host environment. Other JVMs, such as
Kaffe and Apache Harmony, may also use this property in
future. It is ignored on the Java 1.4 and earlier runtimes.
This property maybe enough to give command-line Ant builds network access, although in practise the results are inconsistent.
It is has also been reported a breaking the IBM Java 5 runtime 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.
To make the -autoproxy 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.
The java.net.useSystemProxies
is checked only once, at
startup time, the other checks (registry, gconf
, system
properties) are done dynamically whenever needed (socket connection,
URL connection etc..).
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.
The JVM uses the gconf
library to look at specific
entries. The GConf-2
settings used are:
- /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
If you are using KDE or another GUI than Gnome, you can still use
the gconf-editor
tool to add these entries.
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"
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.
For Windows, set the ANT_OPTS
environment variable in
the appropriate "My Computer" properties dialog box (XP), "Computer"
properties (Vista)
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:
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>
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.
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.
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.
Any program that is executed with <java>
without
setting fork=true
will pick up the Ant's
settings. If you need different values,
set fork=false
and provide the values
in <sysproperty>
elements.
If you wish to have a forked process pick up the Ant's settings, use
the <syspropertyset>
element to propagate the normal proxy settings. The following
propertyset is a datatype which can be referenced in
a <java>
task to pass down the current values.
<propertyset id="proxy.properties"> <propertyref prefix="java.net.useSystemProxies"/> <propertyref prefix="http."/> <propertyref prefix="https."/> <propertyref prefix="ftp."/> <propertyref prefix="socksProxy"/> </propertyset>
There are four ways to set up proxies in Ant.
ANT_ARGS
environment variable.<setproxy>
task.Proxy settings are automatically shared with Java programs started under Ant that are not forked; to pass proxy settings down to subsidiary programs, use a propertyset.
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 -autoproxy option or use one of the alternate mechanisms to configure the JVM.