takes over some of the functionality traditionally found in the Ant launch scripts. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@274724 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -18,12 +18,31 @@ | |||
| <property environment="env"/> | |||
| <!-- | |||
| =================================================================== | |||
| Set the properties that control names and versions | |||
| =================================================================== | |||
| --> | |||
| <property name="Name" value="Apache Ant"/> | |||
| <property name="name" value="ant"/> | |||
| <property name="version" value="1.6alpha"/> | |||
| <property name="manifest-version" value="1.5.9"/> | |||
| <property name="manifest-version" value="1.6"/> | |||
| <property name="bootstrap.jar" value="ant-bootstrap.jar"/> | |||
| <property name="ant.package" value="org/apache/tools/ant"/> | |||
| <property name="optional.package" value="${ant.package}/taskdefs/optional"/> | |||
| <property name="optional.type.package" value="${ant.package}/types/optional"/> | |||
| <property name="apache.resolver.type.package" value="${ant.package}/types/resolver"/> | |||
| <property name="util.package" value="${ant.package}/util"/> | |||
| <property name="regexp.package" value="${util.package}/regexp"/> | |||
| <property name="optional.jars.prefix" value="ant"/> | |||
| <!-- | |||
| =================================================================== | |||
| Set the properties that control various build options | |||
| =================================================================== | |||
| --> | |||
| <property name="debug" value="true"/> | |||
| <property name="chmod.fail" value="true"/> | |||
| <property name="chmod.maxparallel" value="250"/> | |||
| @@ -33,6 +52,8 @@ | |||
| <property name="junit.fork" value="false"/> | |||
| <property name="junit.filtertrace" value="off"/> | |||
| <property name="junit.summary" value="no"/> | |||
| <property name="test.haltonfailure" value="yes" /> | |||
| <property name="unfiltered.files" value="**/*.gif,**/*.jpg,**/*.ico,**/*.pdf"/> | |||
| <!-- | |||
| =================================================================== | |||
| @@ -47,20 +68,8 @@ | |||
| <property name="etc.dir" value="src/etc"/> | |||
| <property name="tests.dir" value="src/testcases"/> | |||
| <property name="tests.etc.dir" value="src/etc/testcases"/> | |||
| <property name="test.haltonfailure" value="yes" /> | |||
| <property name="ant.package" value="org/apache/tools/ant"/> | |||
| <property name="optional.package" value="${ant.package}/taskdefs/optional"/> | |||
| <property name="optional.type.package" value="${ant.package}/types/optional"/> | |||
| <property name="apache.resolver.type.package" value="${ant.package}/types/resolver"/> | |||
| <property name="util.package" value="${ant.package}/util"/> | |||
| <property name="regexp.package" value="${util.package}/regexp"/> | |||
| <property name="manifest" value="src/etc/manifest"/> | |||
| <property name="unfiltered.files" value="**/*.gif,**/*.jpg,**/*.ico,**/*.pdf"/> | |||
| <!-- | |||
| =================================================================== | |||
| Set the properties for the build area | |||
| @@ -74,8 +83,12 @@ | |||
| <property name="build.tests" value="${build.dir}/testcases"/> | |||
| <property name="build.tests.javadocs" value="${build.dir}/javadocs.test/"/> | |||
| <property name="manifest.tmp" value="${build.dir}/optional.manifest"/> | |||
| <property name="optional.jars.prefix" value="ant"/> | |||
| <!-- | |||
| =================================================================== | |||
| Set the paths used in the build | |||
| =================================================================== | |||
| --> | |||
| <path id="classpath"> | |||
| </path> | |||
| @@ -90,7 +103,8 @@ | |||
| <pathelement location="${tests.etc.dir}"/> | |||
| <path refid="classpath"/> | |||
| </path> | |||
| <!-- turn this path into a string which is passed to the tests --> | |||
| <!-- turn this path into a string which is passed to the tests --> | |||
| <property name="tests-classpath.value" | |||
| refid="tests-classpath"/> | |||
| @@ -113,8 +127,6 @@ | |||
| <property name="src.dist.docs" value="${src.dist.dir}/docs"/> | |||
| <property name="src.dist.lib" value="${src.dist.dir}/lib"/> | |||
| <!-- | |||
| =================================================================== | |||
| Set up selectors to be used by javac, junit and jar to exclude | |||
| @@ -128,6 +140,7 @@ | |||
| <filename name="${optional.package}/extension/**"/> | |||
| </or> | |||
| </selector> | |||
| <selector id="needs.jdk1.4+"> | |||
| <or> | |||
| <filename name="${regexp.package}/Jdk14Regexp*"/> | |||
| @@ -142,9 +155,11 @@ | |||
| <filename name="${optional.package}/Javah*"/> | |||
| </or> | |||
| </selector> | |||
| <selector id="needs.sun.uue"> | |||
| <filename name="${ant.package}/taskdefs/email/UUMailer*"/> | |||
| </selector> | |||
| <selector id="needs.sun.b64"> | |||
| <or> | |||
| <filename name="${optional.package}/splash/SplashTask*"/> | |||
| @@ -161,27 +176,34 @@ | |||
| <filename name="${ant.package}/types/XMLCatalogBuildFileTest*"/> | |||
| </or> | |||
| </selector> | |||
| <selector id="needs.xalan1"> | |||
| <or> | |||
| <filename name="${optional.package}/XalanLiaison*"/> | |||
| <filename name="${optional.package}/junit/Xalan1Executor*"/> | |||
| </or> | |||
| </selector> | |||
| <selector id="needs.xalan2"> | |||
| <filename name="${optional.package}/junit/Xalan2Executor*"/> | |||
| </selector> | |||
| <selector id="needs.xslp"> | |||
| <filename name="${optional.package}/XslpLiaison*"/> | |||
| </selector> | |||
| <selector id="needs.apache.resolver"> | |||
| <filename name="${apache.resolver.type.package}/**"/> | |||
| </selector> | |||
| <selector id="needs.junit"> | |||
| <filename name="${optional.package}/junit/**"/> | |||
| </selector> | |||
| <selector id="needs.jakarta.regexp"> | |||
| <filename name="${regexp.package}/JakartaRegexp*"/> | |||
| </selector> | |||
| <selector id="needs.jakarta.oro"> | |||
| <or> | |||
| <filename name="${regexp.package}/JakartaOro*"/> | |||
| @@ -189,6 +211,7 @@ | |||
| <filename name="${optional.package}/metamata/MAudit*"/> | |||
| </or> | |||
| </selector> | |||
| <selector id="needs.jakarta.bcel"> | |||
| <or> | |||
| <filename name="${ant.package}/filters/util/JavaClassHelper*"/> | |||
| @@ -196,12 +219,15 @@ | |||
| <filename name="${optional.type.package}/depend/ClassFileSetTest*"/> | |||
| </or> | |||
| </selector> | |||
| <selector id="needs.jakarta.log4j"> | |||
| <filename name="${ant.package}/listener/Log4jListener*"/> | |||
| </selector> | |||
| <selector id="needs.commons.logging"> | |||
| <filename name="${ant.package}/listener/CommonsLoggingListener*"/> | |||
| </selector> | |||
| <selector id="needs.bsf"> | |||
| <or> | |||
| <filename name="${optional.package}/Script*"/> | |||
| @@ -209,32 +235,40 @@ | |||
| <filename name="${optional.type.package}/Script*"/> | |||
| </or> | |||
| </selector> | |||
| <selector id="needs.stylebook"> | |||
| <filename name="${optional.package}/StyleBook*"/> | |||
| </selector> | |||
| <selector id="needs.javamail"> | |||
| <or> | |||
| <filename name="${ant.package}/taskdefs/email/MimeMailer*"/> | |||
| </or> | |||
| </selector> | |||
| <selector id="needs.icontract"> | |||
| <filename name="${optional.package}/IContract*"/> | |||
| </selector> | |||
| <selector id="needs.netrexx"> | |||
| <filename name="${optional.package}/NetRexxC*"/> | |||
| </selector> | |||
| <selector id="needs.weblogic.ejbc"> | |||
| <filename name="${optional.package}/ejb/Ejbc*"/> | |||
| </selector> | |||
| <selector id="needs.weblogic.ddcreator"> | |||
| <filename name="${optional.package}/ejb/DDCreator*"/> | |||
| </selector> | |||
| <selector id="needs.weblogic.server"> | |||
| <or> | |||
| <filename name="${optional.package}/ejb/WLRun*"/> | |||
| <filename name="${optional.package}/ejb/WLStop*"/> | |||
| </or> | |||
| </selector> | |||
| <selector id="needs.commons.net"> | |||
| <or> | |||
| <filename name="${optional.package}/net/FTP*"/> | |||
| @@ -242,40 +276,54 @@ | |||
| <filename name="${optional.package}/net/TelnetTask*"/> | |||
| </or> | |||
| </selector> | |||
| <selector id="needs.starteam"> | |||
| <or> | |||
| <filename name="${optional.package}/scm/AntStarTeam*"/> | |||
| <filename name="${optional.package}/starteam/*"/> | |||
| </or> | |||
| </selector> | |||
| <selector id="needs.vaj"> | |||
| <filename name="${optional.package}/ide/VAJ*"/> | |||
| </selector> | |||
| <selector id="needs.antlr"> | |||
| <filename name="${optional.package}/ANTLR*"/> | |||
| </selector> | |||
| <selector id="needs.jmf"> | |||
| <filename name="${optional.package}/sound/*"/> | |||
| </selector> | |||
| <selector id="needs.jai"> | |||
| <or> | |||
| <filename name="${optional.package}/image/*"/> | |||
| <filename name="${ant.package}/types/optional/image/*"/> | |||
| </or> | |||
| </selector> | |||
| <selector id="needs.jdepend"> | |||
| <filename name="${optional.package}/jdepend/*"/> | |||
| </selector> | |||
| <selector id="needs.swing"> | |||
| <filename name="${optional.package}/splash/*"/> | |||
| </selector> | |||
| <selector id="needs.jsch"> | |||
| <filename name="${optional.package}/ssh/*"/> | |||
| </selector> | |||
| <selector id="ant.launcher"> | |||
| <filename name="${ant.package}/launch/**/*"/> | |||
| </selector> | |||
| <patternset id="onlinetests"> | |||
| <exclude name="**/GetTest.java" if="offline"/> | |||
| <exclude name="**/SignJarTest.java" if="offline"/> | |||
| </patternset> | |||
| <patternset id="teststhatfail"> | |||
| <exclude name="${optional.package}/BeanShellScriptTest.java"/> | |||
| <exclude name="${ant.package}/taskdefs/ImportTest.java"/> | |||
| @@ -617,12 +665,11 @@ | |||
| <include name="junit-noframes.xsl"/> | |||
| </fileset> | |||
| </copy> | |||
| </target> | |||
| <!-- | |||
| =================================================================== | |||
| Create the Apache Ant jars: ant.jar and optional.jar | |||
| Create the all of the Apache Ant jars | |||
| =================================================================== | |||
| --> | |||
| <target name="jars" | |||
| @@ -659,6 +706,15 @@ | |||
| </section> | |||
| </manifest> | |||
| <jar destfile="${build.lib}/${name}-launcher.jar" | |||
| basedir="${build.classes}"> | |||
| <selector refid="ant.launcher"/> | |||
| <manifest> | |||
| <attribute name="Main-Class" value="org.apache.tools.ant.launch.Launcher"/> | |||
| <attribute name="Class-Path" value="xercesImpl.jar xml-apis.jar"/> | |||
| </manifest> | |||
| </jar> | |||
| <jar destfile="${build.lib}/${name}.jar" | |||
| basedir="${build.classes}" | |||
| manifest="${manifest}"> | |||
| @@ -675,6 +731,7 @@ | |||
| <selector refid="needs.jakarta.oro"/> | |||
| <selector refid="needs.jdk1.4+"/> | |||
| <selector refid="needs.javamail"/> | |||
| <selector refid="ant.launcher"/> | |||
| </or> | |||
| </selector> | |||
| </not> | |||
| @@ -66,6 +66,8 @@ import java.util.Vector; | |||
| import org.apache.tools.ant.input.DefaultInputHandler; | |||
| import org.apache.tools.ant.input.InputHandler; | |||
| import org.apache.tools.ant.util.JavaEnvUtils; | |||
| import org.apache.tools.ant.launch.AntMain; | |||
| /** | |||
| * Command line entry point into Ant. This class is entered via the | |||
| @@ -79,7 +81,7 @@ import org.apache.tools.ant.util.JavaEnvUtils; | |||
| * | |||
| * @author duncan@x180.com | |||
| */ | |||
| public class Main { | |||
| public class Main implements AntMain { | |||
| /** The default build file name. */ | |||
| public static final String DEFAULT_BUILD_FILENAME = "build.xml"; | |||
| @@ -175,11 +177,25 @@ public class Main { | |||
| */ | |||
| public static void start(String[] args, Properties additionalUserProperties, | |||
| ClassLoader coreLoader) { | |||
| Main m = null; | |||
| Main m = new Main(); | |||
| m.startAnt(args, additionalUserProperties, coreLoader); | |||
| } | |||
| /** | |||
| * Start Ant | |||
| * @param args command line args | |||
| * @param additionalUserProperties properties to set beyond those that | |||
| * may be specified on the args list | |||
| * @param coreLoader - not used | |||
| * | |||
| * @since Ant 1.6 | |||
| */ | |||
| public void startAnt(String[] args, Properties additionalUserProperties, | |||
| ClassLoader coreLoader) { | |||
| try { | |||
| Diagnostics.validateVersion(); | |||
| m = new Main(args); | |||
| processArgs(args); | |||
| } catch (Throwable exc) { | |||
| handleLogfile(); | |||
| printMessage(exc); | |||
| @@ -191,17 +207,17 @@ public class Main { | |||
| e.hasMoreElements();) { | |||
| String key = (String) e.nextElement(); | |||
| String property = additionalUserProperties.getProperty(key); | |||
| m.definedProps.put(key, property); | |||
| definedProps.put(key, property); | |||
| } | |||
| } | |||
| // expect the worst | |||
| int exitCode = 1; | |||
| try { | |||
| m.runBuild(coreLoader); | |||
| runBuild(coreLoader); | |||
| exitCode = 0; | |||
| } catch (BuildException be) { | |||
| if (m.err != System.err) { | |||
| if (err != System.err) { | |||
| printMessage(be); | |||
| } | |||
| } catch (Throwable exc) { | |||
| @@ -248,6 +264,13 @@ public class Main { | |||
| start(args, null, null); | |||
| } | |||
| /** | |||
| * Constructor used when creating Main for later arg processing | |||
| * and startup | |||
| */ | |||
| public Main() { | |||
| } | |||
| /** | |||
| * Sole constructor, which parses and deals with command line | |||
| * arguments. | |||
| @@ -258,6 +281,17 @@ public class Main { | |||
| * or is a directory. | |||
| */ | |||
| protected Main(String[] args) throws BuildException { | |||
| processArgs(args); | |||
| } | |||
| /** | |||
| * Process command line arguments | |||
| * | |||
| * @param args the command line arguments. | |||
| * | |||
| * @since Ant 1.6 | |||
| */ | |||
| private void processArgs(String[] args) { | |||
| String searchForThis = null; | |||
| PrintStream logTo = null; | |||
| @@ -656,8 +690,8 @@ public class Main { | |||
| try { | |||
| BuildListener listener = | |||
| (BuildListener) Class.forName(className).newInstance(); | |||
| if ( project != null ) { | |||
| project.setProjectReference( listener ); | |||
| if (project != null) { | |||
| project.setProjectReference(listener); | |||
| } | |||
| project.addBuildListener(listener); | |||
| } catch (Throwable exc) { | |||
| @@ -670,6 +704,8 @@ public class Main { | |||
| /** | |||
| * Creates the InputHandler and adds it to the project. | |||
| * | |||
| * @param project the project instance. | |||
| * | |||
| * @exception BuildException if a specified InputHandler | |||
| * implementation could not be loaded. | |||
| */ | |||
| @@ -681,8 +717,8 @@ public class Main { | |||
| try { | |||
| handler = (InputHandler) | |||
| (Class.forName(inputHandlerClassname).newInstance()); | |||
| if ( project != null ) { | |||
| project.setProjectReference( handler ); | |||
| if (project != null) { | |||
| project.setProjectReference(handler); | |||
| } | |||
| } catch (ClassCastException e) { | |||
| String msg = "The specified input handler class " | |||
| @@ -713,7 +749,8 @@ public class Main { | |||
| BuildLogger logger = null; | |||
| if (loggerClassname != null) { | |||
| try { | |||
| logger = (BuildLogger) (Class.forName(loggerClassname).newInstance()); | |||
| Class loggerClass = Class.forName(loggerClassname); | |||
| logger = (BuildLogger) (loggerClass.newInstance()); | |||
| } catch (ClassCastException e) { | |||
| System.err.println("The specified logger class " | |||
| + loggerClassname | |||
| @@ -918,6 +955,8 @@ public class Main { | |||
| * Writes a formatted list of target names to <code>System.out</code> | |||
| * with an optional description. | |||
| * | |||
| * | |||
| * @param project the project instance. | |||
| * @param names The names to be printed. | |||
| * Must not be <code>null</code>. | |||
| * @param descriptions The associated target descriptions. | |||
| @@ -0,0 +1,79 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2003 The Apache Software Foundation. All rights | |||
| * reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| * are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright | |||
| * notice, this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in | |||
| * the documentation and/or other materials provided with the | |||
| * distribution. | |||
| * | |||
| * 3. The end-user documentation included with the redistribution, if | |||
| * any, must include the following acknowlegement: | |||
| * "This product includes software developed by the | |||
| * Apache Software Foundation (http://www.apache.org/)." | |||
| * Alternately, this acknowlegement may appear in the software itself, | |||
| * if and wherever such third-party acknowlegements normally appear. | |||
| * | |||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
| * Foundation" must not be used to endorse or promote products derived | |||
| * from this software without prior written permission. For written | |||
| * permission, please contact apache@apache.org. | |||
| * | |||
| * 5. Products derived from this software may not be called "Apache" | |||
| * nor may "Apache" appear in their names without prior written | |||
| * permission of the Apache Group. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
| * SUCH DAMAGE. | |||
| * ==================================================================== | |||
| * | |||
| * This software consists of voluntary contributions made by many | |||
| * individuals on behalf of the Apache Software Foundation. For more | |||
| * information on the Apache Software Foundation, please see | |||
| * <http://www.apache.org/>. | |||
| */ | |||
| package org.apache.tools.ant.launch; | |||
| import java.util.Properties; | |||
| /** | |||
| * Interface used to bridge to the actual Main class without any | |||
| * messy reflection | |||
| * | |||
| * @author Conor MacNeill | |||
| * @since Ant 1.6 | |||
| */ | |||
| public interface AntMain { | |||
| /** | |||
| * Start Ant. | |||
| * | |||
| * @param args command line args | |||
| * @param additionalUserProperties properties to set beyond those that | |||
| * may be specified on the args list | |||
| * @param coreLoader - not used | |||
| * | |||
| * @since Ant 1.6 | |||
| */ | |||
| void startAnt(String[] args, Properties additionalUserProperties, | |||
| ClassLoader coreLoader); | |||
| } | |||
| @@ -0,0 +1,168 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2003 The Apache Software Foundation. All rights | |||
| * reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| * are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright | |||
| * notice, this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in | |||
| * the documentation and/or other materials provided with the | |||
| * distribution. | |||
| * | |||
| * 3. The end-user documentation included with the redistribution, if | |||
| * any, must include the following acknowlegement: | |||
| * "This product includes software developed by the | |||
| * Apache Software Foundation (http://www.apache.org/)." | |||
| * Alternately, this acknowlegement may appear in the software itself, | |||
| * if and wherever such third-party acknowlegements normally appear. | |||
| * | |||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
| * Foundation" must not be used to endorse or promote products derived | |||
| * from this software without prior written permission. For written | |||
| * permission, please contact apache@apache.org. | |||
| * | |||
| * 5. Products derived from this software may not be called "Apache" | |||
| * nor may "Apache" appear in their names without prior written | |||
| * permission of the Apache Group. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
| * SUCH DAMAGE. | |||
| * ==================================================================== | |||
| * | |||
| * This software consists of voluntary contributions made by many | |||
| * individuals on behalf of the Apache Software Foundation. For more | |||
| * information on the Apache Software Foundation, please see | |||
| * <http://www.apache.org/>. | |||
| */ | |||
| package org.apache.tools.ant.launch; | |||
| import java.net.URL; | |||
| import java.net.URLClassLoader; | |||
| import java.net.MalformedURLException; | |||
| import java.io.File; | |||
| /** | |||
| * This is a launcher for Ant. | |||
| * | |||
| * @author Conor MacNeill | |||
| * @since Ant 1.6 | |||
| */ | |||
| public class Launcher { | |||
| /** The Ant Home property */ | |||
| public static final String ANTHOME_PROPERTY = "ant.home"; | |||
| /** The location of a per-user library directory */ | |||
| public static final String USER_LIBDIR = ".ant/lib"; | |||
| /** The startup class that is to be run */ | |||
| public static final String MAIN_CLASS = "org.apache.tools.ant.Main"; | |||
| /** | |||
| * Entry point for starting command line Ant | |||
| * | |||
| * @param args commandline arguments | |||
| */ | |||
| public static void main(String[] args) { | |||
| try { | |||
| Launcher launcher = new Launcher(); | |||
| launcher.run(args); | |||
| } catch (Throwable t) { | |||
| t.printStackTrace(); | |||
| } | |||
| } | |||
| /** | |||
| * Run the launcher to launch Ant | |||
| * | |||
| * @param args the command line arguments | |||
| * | |||
| * @exception MalformedURLException if the URLs required for the classloader | |||
| * cannot be created. | |||
| */ | |||
| private void run(String[] args) throws MalformedURLException { | |||
| String antHomeProperty = System.getProperty(ANTHOME_PROPERTY); | |||
| File antHome = null; | |||
| URL launchJarURL = Locator.getClassLocationURL(getClass()); | |||
| File jarDir = new File(launchJarURL.getFile()).getParentFile(); | |||
| if (antHomeProperty != null) { | |||
| antHome = new File(antHomeProperty); | |||
| } | |||
| if (antHome == null || !antHome.exists()) { | |||
| URL antHomeURL = new URL(launchJarURL, ".."); | |||
| antHome = new File(antHomeURL.getFile()); | |||
| System.setProperty(ANTHOME_PROPERTY, antHome.getAbsolutePath()); | |||
| } | |||
| if (!antHome.exists()) { | |||
| throw new IllegalStateException("Ant home is set incorrectly or " | |||
| + "ant could not be located"); | |||
| } | |||
| // Now try and find JAVA_HOME | |||
| File toolsJar = Locator.getToolsJar(); | |||
| URL[] systemJars = Locator.getLocationURLs(jarDir); | |||
| File userLibDir | |||
| = new File(System.getProperty("user.home"), USER_LIBDIR); | |||
| URL[] userJars = Locator.getLocationURLs(userLibDir); | |||
| int numJars = userJars.length + systemJars.length; | |||
| if (toolsJar != null) { | |||
| numJars++; | |||
| } | |||
| URL[] jars = new URL[numJars]; | |||
| System.arraycopy(userJars, 0, jars, 0, userJars.length); | |||
| System.arraycopy(systemJars, 0, jars, userJars.length, | |||
| systemJars.length); | |||
| if (toolsJar != null) { | |||
| jars[jars.length - 1] = toolsJar.toURL(); | |||
| } | |||
| // now update the class.path property | |||
| StringBuffer baseClassPath | |||
| = new StringBuffer(System.getProperty("java.class.path")); | |||
| for (int i = 0; i < jars.length; ++i) { | |||
| baseClassPath.append(File.pathSeparatorChar); | |||
| baseClassPath.append(jars[i].getFile()); | |||
| } | |||
| System.setProperty("java.class.path", baseClassPath.toString()); | |||
| URLClassLoader loader = new URLClassLoader(jars); | |||
| try { | |||
| Class mainClass = loader.loadClass(MAIN_CLASS); | |||
| AntMain main = (AntMain) mainClass.newInstance(); | |||
| main.startAnt(args, null, null); | |||
| } catch (Throwable t) { | |||
| t.printStackTrace(); | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,226 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2003 The Apache Software Foundation. All rights | |||
| * reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| * are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright | |||
| * notice, this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in | |||
| * the documentation and/or other materials provided with the | |||
| * distribution. | |||
| * | |||
| * 3. The end-user documentation included with the redistribution, if | |||
| * any, must include the following acknowlegement: | |||
| * "This product includes software developed by the | |||
| * Apache Software Foundation (http://www.apache.org/)." | |||
| * Alternately, this acknowlegement may appear in the software itself, | |||
| * if and wherever such third-party acknowlegements normally appear. | |||
| * | |||
| * 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
| * Foundation" must not be used to endorse or promote products derived | |||
| * from this software without prior written permission. For written | |||
| * permission, please contact apache@apache.org. | |||
| * | |||
| * 5. Products derived from this software may not be called "Apache" | |||
| * nor may "Apache" appear in their names without prior written | |||
| * permission of the Apache Group. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
| * SUCH DAMAGE. | |||
| * ==================================================================== | |||
| * | |||
| * This software consists of voluntary contributions made by many | |||
| * individuals on behalf of the Apache Software Foundation. For more | |||
| * information on the Apache Software Foundation, please see | |||
| * <http://www.apache.org/>. | |||
| */ | |||
| package org.apache.tools.ant.launch; | |||
| import java.net.MalformedURLException; | |||
| import java.net.URL; | |||
| import java.io.File; | |||
| import java.io.FilenameFilter; | |||
| /** | |||
| * The Locator is a utility class which is used to find certain items | |||
| * in the environment | |||
| * | |||
| * @author Conor MacNeill | |||
| * @since Ant 1.6 | |||
| */ | |||
| public class Locator { | |||
| /** | |||
| * Get the URL for the given class's load location. | |||
| * | |||
| * @param theClass the class whose load URL is desired. | |||
| * @return a URL which identifies the component from which this class | |||
| * was loaded. | |||
| * @throws MalformedURLException if the class' URL cannot be | |||
| * constructed. | |||
| */ | |||
| public static URL getClassLocationURL(Class theClass) | |||
| throws MalformedURLException { | |||
| String className = theClass.getName().replace('.', '/') + ".class"; | |||
| URL classRawURL = theClass.getClassLoader().getResource(className); | |||
| String fileComponent = classRawURL.getFile(); | |||
| if (classRawURL.getProtocol().equals("file")) { | |||
| // Class comes from a directory of class files rather than | |||
| // from a jar. | |||
| int classFileIndex = fileComponent.lastIndexOf(className); | |||
| if (classFileIndex != -1) { | |||
| fileComponent = fileComponent.substring(0, classFileIndex); | |||
| } | |||
| return new URL("file:" + fileComponent); | |||
| } else if (classRawURL.getProtocol().equals("jar")) { | |||
| // Class is coming from a jar. The file component of the URL | |||
| // is actually the URL of the jar file | |||
| int classSeparatorIndex = fileComponent.lastIndexOf("!"); | |||
| if (classSeparatorIndex != -1) { | |||
| fileComponent = fileComponent.substring(0, classSeparatorIndex); | |||
| } | |||
| return new URL(fileComponent); | |||
| } else { | |||
| // its running out of something besides a jar. | |||
| // We just return the Raw URL as a best guess | |||
| return classRawURL; | |||
| } | |||
| } | |||
| /** | |||
| * Get the URL necessary to load the Sun compiler tools. If the classes | |||
| * are available to this class, then no additional URL is required and | |||
| * null is returned. This may be because the classes are explcitly in the | |||
| * class path or provided by the JVM directly | |||
| * | |||
| * @return the tools jar as a File if required, null otherwise | |||
| */ | |||
| public static File getToolsJar() { | |||
| // firstly check if the tols jar is alreayd n the classpath | |||
| boolean toolsJarAvailable = false; | |||
| try { | |||
| // just check whether this throws an exception | |||
| Class.forName("com.sun.tools.javac.Main"); | |||
| toolsJarAvailable = true; | |||
| } catch (Exception e) { | |||
| try { | |||
| Class.forName("sun.tools.javac.Main"); | |||
| toolsJarAvailable = true; | |||
| } catch (Exception e2) { | |||
| // ignore | |||
| } | |||
| } | |||
| if (toolsJarAvailable) { | |||
| return null; | |||
| } | |||
| // couldn't find compiler - try to find tools.jar | |||
| // based on java.home setting | |||
| String javaHome = System.getProperty("java.home"); | |||
| if (javaHome.endsWith("jre")) { | |||
| javaHome = javaHome.substring(0, javaHome.length() - 4); | |||
| } | |||
| File toolsJar = new File(javaHome + "/lib/tools.jar"); | |||
| if (!toolsJar.exists()) { | |||
| System.out.println("Unable to locate tools.jar. " | |||
| + "Expected to find it in " + toolsJar.getPath()); | |||
| return null; | |||
| } | |||
| return toolsJar; | |||
| } | |||
| /** | |||
| * Get an array or URLs representing all of the jar files in the | |||
| * given location. If the location is a file, it is returned as the only | |||
| * element of the array. If the location is a directory, it is scanned for | |||
| * jar files | |||
| * | |||
| * @param location the location to scan for Jars | |||
| * | |||
| * @return an array of URLs for all jars in the given location. | |||
| * | |||
| * @exception MalformedURLException if the URLs for the jars cannot be | |||
| * formed | |||
| */ | |||
| public static URL[] getLocationURLs(File location) | |||
| throws MalformedURLException { | |||
| return getLocationURLs(location, new String[]{".jar"}); | |||
| } | |||
| /** | |||
| * Get an array or URLs representing all of the files of a given set of | |||
| * extensions in the given location. If the location is a file, it is | |||
| * returned as the only element of the array. If the location is a | |||
| * directory, it is scanned for matching files | |||
| * | |||
| * @param location the location to scan for files | |||
| * @param extensions an array of extension that are to match in the | |||
| * directory search | |||
| * | |||
| * @return an array of URLs of matching files | |||
| * @exception MalformedURLException if the URLs for the files cannot be | |||
| * formed | |||
| */ | |||
| public static URL[] getLocationURLs(File location, | |||
| final String[] extensions) | |||
| throws MalformedURLException { | |||
| URL[] urls = new URL[0]; | |||
| if (!location.exists()) { | |||
| return urls; | |||
| } | |||
| if (!location.isDirectory()) { | |||
| urls = new URL[1]; | |||
| String path = location.getPath(); | |||
| for (int i = 0; i < extensions.length; ++i) { | |||
| if (path.endsWith(extensions[i])) { | |||
| urls[0] = location.toURL(); | |||
| break; | |||
| } | |||
| } | |||
| return urls; | |||
| } | |||
| File[] matches = location.listFiles( | |||
| new FilenameFilter() { | |||
| public boolean accept(File dir, String name) { | |||
| for (int i = 0; i < extensions.length; ++i) { | |||
| if (name.endsWith(extensions[i])) { | |||
| return true; | |||
| } | |||
| } | |||
| return false; | |||
| } | |||
| }); | |||
| urls = new URL[matches.length]; | |||
| for (int i = 0; i < matches.length; ++i) { | |||
| urls[i] = matches[i].toURL(); | |||
| } | |||
| return urls; | |||
| } | |||
| } | |||