conor       2003/06/27 04:19:22

  Modified:    .        build.xml
               src/main/org/apache/tools/ant Main.java
  Added:       src/main/org/apache/tools/ant/launch AntMain.java
                        Launcher.java Locator.java
  Log:
  New Launch facility. Separate jar now can be used to launch Ant which
  takes over some of the functionality traditionally found in the Ant launch
  scripts.
  
  Revision  Changes    Path
  1.383     +76 -19    ant/build.xml
  
  Index: build.xml
  ===================================================================
  RCS file: /home/cvs/ant/build.xml,v
  retrieving revision 1.382
  retrieving revision 1.383
  diff -u -w -u -r1.382 -r1.383
  --- build.xml 9 Jun 2003 13:38:05 -0000       1.382
  +++ build.xml 27 Jun 2003 11:19:22 -0000      1.383
  @@ -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,6 +103,7 @@
       <pathelement location="${tests.etc.dir}"/>
       <path refid="classpath"/>
     </path>
  +  
   <!--   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>
  
  
  
  1.84      +50 -11    ant/src/main/org/apache/tools/ant/Main.java
  
  Index: Main.java
  ===================================================================
  RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/Main.java,v
  retrieving revision 1.83
  retrieving revision 1.84
  diff -u -w -u -r1.83 -r1.84
  --- Main.java 10 Jun 2003 13:29:55 -0000      1.83
  +++ Main.java 27 Jun 2003 11:19:22 -0000      1.84
  @@ -66,6 +66,8 @@
   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 @@
    *
    * @author [EMAIL PROTECTED]
    */
  -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 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 @@
                       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) {
  @@ -249,6 +265,13 @@
       }
   
       /**
  +     * 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 @@
        *                           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;
   
  @@ -670,6 +704,8 @@
       /**
        * 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.
        */
  @@ -713,7 +749,8 @@
           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 @@
        * 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.
  
  
  
  1.1                  ant/src/main/org/apache/tools/ant/launch/AntMain.java
  
  Index: AntMain.java
  ===================================================================
  /*
   * 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 [EMAIL PROTECTED]
   *
   * 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);
  }
  
  
  
  
  1.1                  ant/src/main/org/apache/tools/ant/launch/Launcher.java
  
  Index: Launcher.java
  ===================================================================
  /*
   * 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 [EMAIL PROTECTED]
   *
   * 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();
          }
      }
  }
  
  
  
  
  1.1                  ant/src/main/org/apache/tools/ant/launch/Locator.java
  
  Index: Locator.java
  ===================================================================
  /*
   * 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 [EMAIL PROTECTED]
   *
   * 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;
      }
  }
  
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to