From b31c3d79f047cc3a19eca9c174860145b5ab723e Mon Sep 17 00:00:00 2001 From: Steve Loughran Date: Wed, 17 Aug 2005 13:59:28 +0000 Subject: [PATCH] Add java1.5 system proxy support, as per bug 36174. I do not see any evidence of this working on my kde/linux system; I will check out and test on Windows.Other tests on other platforms welcome. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@278520 13f79535-47bb-0310-9956-ffa450edef68 --- WHATSNEW | 7 + docs/manual/installlist.html | 1 + docs/manual/proxy.html | 194 ++++++++++++++++++ src/main/org/apache/tools/ant/Main.java | 18 +- .../org/apache/tools/ant/util/ProxySetup.java | 81 ++++++++ 5 files changed, 300 insertions(+), 1 deletion(-) create mode 100644 docs/manual/proxy.html create mode 100644 src/main/org/apache/tools/ant/util/ProxySetup.java diff --git a/WHATSNEW b/WHATSNEW index 9d8f0dc8e..ee383c300 100644 --- a/WHATSNEW +++ b/WHATSNEW @@ -56,6 +56,13 @@ Changes that could break older environments: Scripts which previously used timediffmillis to do this compensation may need to be rewritten. timediffmillis has now been deprecated. +* On Java1.5+, Ant automatically sets the system property + java.net.useSystemProxies to true, which gives it automatic use of the local + IE (Windows) or Gnome2 (Unix/Linux) proxy settings. This may break any build + file that somehow relied on content outside the firewall being unreachable: + use the -noproxy command-line option to disable this new feature, or set + + Fixed bugs: ----------- diff --git a/docs/manual/installlist.html b/docs/manual/installlist.html index 7c22b0cf6..f324dc0ef 100644 --- a/docs/manual/installlist.html +++ b/docs/manual/installlist.html @@ -18,6 +18,7 @@ Building Ant
Library Dependencies
Platform Specific Issues
+ Proxy configuration


diff --git a/docs/manual/proxy.html b/docs/manual/proxy.html new file mode 100644 index 000000000..8bc507b54 --- /dev/null +++ b/docs/manual/proxy.html @@ -0,0 +1,194 @@ + + + + + +Proxy Configuration + + + +

Proxy Configuration

+ +

+ +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 longstanding problem with Java and Ant, which Java1.5 finally + addresses. When Ant is run under Java1.5, it automatically sets the + java.net.useSystemProxies system property, telling the JVM to + switch to the OS-configured proxy settings.This is automatic, but it can be disabled. +

+

+ When running Ant on older JVMs, this property is ignored. There are two other + ways to configure Ant's proxy settings in these cases. +

+ + + +

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

+

+ When Ant starts up, it automatically 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, which is why Ant always sets the + property -it is ignored on the Java1.4 and earlier runtimes. +

+

+ This property should be enough to automatically give Ant hosted + builds network access. It may also work under an IDE, though that depends + upon the IDE and how it starts ant. If it bypasses Ant's Main entry point, + the proxy setup may be skipped, and if networking has already started up + by the time ant is run, the option may be ignored. Consult your IDE + documentation for IDE-specific information upon proxy setup. +

+

+ To disable this automatic feature, set the command line option + -noproxy, or set a JVM or Ant property + java.net.useSystemProxies to a value other than + true or on. If the JVM option is already set, + Ant will not touch it; if an Ant property of that name is set, Ant will + pass the value of that property down to the JVM. +

+

+ 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. + +

+ The biggest 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. Furthermore, unless the user + is running an adaptive + laptop, the host's proxy settings will not-automatically adapt to + changes in network context. The -noproxy option may be a useful + one to use when roaming. +

+ +

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 ants 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. +
  3. Not dynamic enough to deal with laptop configuration changes.
  4. +
+

+ If you are using Ant on a pre-Java1.5 machine behind a firewall, this is + the simplest and best way to configure your runtime to work with build files + that go beyond the firewall. +

+ +

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. Automatically, with Ant1.7 -use -noproxy to disable this.
  2. +
  3. Via JVM system properties -set these in the ANT_ARGS environment variable.
  4. +
  5. Via the <setproxy> task.
  6. +
+ +

+As Java1.5 adoption increases, automatic proxy support should become more +widespread. For this reason, we would encourage users not to try and +second-guess network configurations with setproxy, and instead to encourage +users to move up to Ant1.7/Java1.5, and if they cannot, to set proxy options +in the ANT_ARGS environment variable. +

+ +

Further reading

+ + + + \ No newline at end of file diff --git a/src/main/org/apache/tools/ant/Main.java b/src/main/org/apache/tools/ant/Main.java index 0071a32b2..97aa852a9 100644 --- a/src/main/org/apache/tools/ant/Main.java +++ b/src/main/org/apache/tools/ant/Main.java @@ -31,6 +31,7 @@ import org.apache.tools.ant.input.InputHandler; import org.apache.tools.ant.launch.AntMain; import org.apache.tools.ant.util.ClasspathUtils; import org.apache.tools.ant.util.FileUtils; +import org.apache.tools.ant.util.ProxySetup; /** @@ -120,6 +121,11 @@ public class Main implements AntMain { */ private Integer threadPriority = null; + /** + * proxy flag: default is true + */ + private boolean proxy=true; + /** * Prints the message of the Throwable if it (the message) is not * null. @@ -423,6 +429,8 @@ public class Main implements AntMain { + "\nThis can be caused by a version mismatch between " + "the ant script/.bat file and Ant itself."; throw new BuildException(msg); + } else if (arg.equals("-noproxy")) { + proxy=false; } else if (arg.startsWith("-")) { // we don't have any more args to recognize! String msg = "Unknown argument: " + arg; @@ -627,6 +635,8 @@ public class Main implements AntMain { } } + + project.init(); project.setUserProperty(MagicNames.ANT_VERSION, getAntVersion()); @@ -642,6 +652,11 @@ public class Main implements AntMain { buildFile.getAbsolutePath()); project.setKeepGoingMode(keepGoingMode); + if (proxy) { + //proxy setup if enabled + ProxySetup proxySetup = new ProxySetup(project); + proxySetup.enableProxies(); + } ProjectHelper.configureProject(project, buildFile); @@ -809,7 +824,8 @@ public class Main implements AntMain { + lSep); msg.append(" -nouserlib Run ant without using the jar files from" + lSep + " ${user.home}/.ant/lib" + lSep); - msg.append(" -noclasspath Run ant without using CLASSPATH"); + msg.append(" -noclasspath Run ant without using CLASSPATH" + lSep); + msg.append(" -noproxy Java 1.5 only: do not use the OS proxies"); System.out.println(msg.toString()); } diff --git a/src/main/org/apache/tools/ant/util/ProxySetup.java b/src/main/org/apache/tools/ant/util/ProxySetup.java new file mode 100644 index 000000000..df690276e --- /dev/null +++ b/src/main/org/apache/tools/ant/util/ProxySetup.java @@ -0,0 +1,81 @@ +/* + * Copyright 2005 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +package org.apache.tools.ant.util; + +import org.apache.tools.ant.Project; + +/** + * Code to do proxy setup. This is just factored out of the main system just for + * @since Ant1.7 + */ + +public class ProxySetup { + + private Project owner; + + /** + * Java1.5 property that enables use of system proxies. + * @value + */ + public static final String USE_SYSTEM_PROXIES="java.net.useSystemProxies"; + + + /** + * create a proxy setup class bound to this project + * @param owner + */ + public ProxySetup(Project owner) { + this.owner = owner; + } + + /** + * Get the current system property settings + * @return current value; null for none or no access + */ + public static String getSystemProxySetting() { + try { + return System.getProperty(USE_SYSTEM_PROXIES); + } catch (SecurityException e) { + //if you cannot read it, you wont be able to write it either + return null; + } + } + + /** + * turn proxies on; + * if the proxy key is already set to some value: leave alone. + * if an ant property of the value {@link #USE_SYSTEM_PROXIES} + * is set, use that instead. Else set to "true". + */ + public void enableProxies() { + if(!(getSystemProxySetting() != null)) { + String proxies =owner.getProperty(USE_SYSTEM_PROXIES); + if(proxies ==null || Project.toBoolean(proxies)) { + proxies ="true"; + } + String message = "setting " + USE_SYSTEM_PROXIES + " to " + proxies; + try { + owner.log(message,Project.MSG_DEBUG); + System.setProperty(USE_SYSTEM_PROXIES,proxies); + } catch (SecurityException e) { + owner.log("Security Exception when "+message); + } + } + } + +}