It has a side effect of making ant a generic launcher of things; anything that implements AntMain.startAnt. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@421588 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -26,6 +26,8 @@ import java.io.PrintStream; | |||||
| import java.util.Enumeration; | import java.util.Enumeration; | ||||
| import java.util.Properties; | import java.util.Properties; | ||||
| import java.util.Vector; | import java.util.Vector; | ||||
| import java.util.HashMap; | |||||
| import org.apache.tools.ant.input.DefaultInputHandler; | import org.apache.tools.ant.input.DefaultInputHandler; | ||||
| import org.apache.tools.ant.input.InputHandler; | import org.apache.tools.ant.input.InputHandler; | ||||
| import org.apache.tools.ant.launch.AntMain; | import org.apache.tools.ant.launch.AntMain; | ||||
| @@ -271,7 +273,7 @@ public class Main implements AntMain { | |||||
| /** | /** | ||||
| * Process command line arguments. | * Process command line arguments. | ||||
| * When ant is started from Launcher, the -lib argument does not get | |||||
| * When ant is started from Launcher, launcher-only arguments doe not get | |||||
| * passed through to this routine. | * passed through to this routine. | ||||
| * | * | ||||
| * @param args the command line arguments. | * @param args the command line arguments. | ||||
| @@ -282,6 +284,15 @@ public class Main implements AntMain { | |||||
| String searchForThis = null; | String searchForThis = null; | ||||
| PrintStream logTo = null; | PrintStream logTo = null; | ||||
| //this is hte list of lu | |||||
| HashMap launchCommands =new HashMap(); | |||||
| launchCommands.put("-lib",""); | |||||
| launchCommands.put("-cp", ""); | |||||
| launchCommands.put("-noclasspath", ""); | |||||
| launchCommands.put("--noclasspath", ""); | |||||
| launchCommands.put("-nouserlib", ""); | |||||
| launchCommands.put("--nouserlib", ""); | |||||
| launchCommands.put("-main", ""); | |||||
| // cycle through given args | // cycle through given args | ||||
| for (int i = 0; i < args.length; i++) { | for (int i = 0; i < args.length; i++) { | ||||
| @@ -431,7 +442,7 @@ public class Main implements AntMain { | |||||
| throw new BuildException( | throw new BuildException( | ||||
| "Niceness value is out of the range 1-10"); | "Niceness value is out of the range 1-10"); | ||||
| } | } | ||||
| } else if (arg.equals("-cp") || arg.equals("-lib")) { | |||||
| } else if (launchCommands.get(arg)!=null) { | |||||
| //catch script/ant mismatch with a meaningful message | //catch script/ant mismatch with a meaningful message | ||||
| //we could ignore it, but there are likely to be other | //we could ignore it, but there are likely to be other | ||||
| //version problems, so we stamp down on the configuration now | //version problems, so we stamp down on the configuration now | ||||
| @@ -445,7 +456,7 @@ public class Main implements AntMain { | |||||
| } else if (arg.startsWith("-")) { | } else if (arg.startsWith("-")) { | ||||
| // we don't have any more args to recognize! | // we don't have any more args to recognize! | ||||
| String msg = "Unknown argument: " + arg; | String msg = "Unknown argument: " + arg; | ||||
| System.out.println(msg); | |||||
| System.err.println(msg); | |||||
| printUsage(); | printUsage(); | ||||
| throw new BuildException(""); | throw new BuildException(""); | ||||
| } else { | } else { | ||||
| @@ -835,7 +846,9 @@ public class Main implements AntMain { | |||||
| msg.append(" -nouserlib Run ant without using the jar files from" + lSep | msg.append(" -nouserlib Run ant without using the jar files from" + lSep | ||||
| + " ${user.home}/.ant/lib" + lSep); | + " ${user.home}/.ant/lib" + lSep); | ||||
| msg.append(" -noclasspath Run ant without using CLASSPATH" + lSep); | msg.append(" -noclasspath Run ant without using CLASSPATH" + lSep); | ||||
| msg.append(" -noproxy Java 1.5 only: do not use the OS proxies"); | |||||
| msg.append(" -noproxy Java 1.5 only: do not use the OS proxies" + | |||||
| lSep); | |||||
| msg.append(" -main <class> override Ant's normal entry point"); | |||||
| System.out.println(msg.toString()); | System.out.println(msg.toString()); | ||||
| } | } | ||||
| @@ -95,16 +95,24 @@ public class Launcher { | |||||
| * @param args commandline arguments | * @param args commandline arguments | ||||
| */ | */ | ||||
| public static void main(String[] args) { | public static void main(String[] args) { | ||||
| int exitCode; | |||||
| try { | try { | ||||
| Launcher launcher = new Launcher(); | Launcher launcher = new Launcher(); | ||||
| launcher.run(args); | |||||
| exitCode=launcher.run(args); | |||||
| } catch (LaunchException e) { | } catch (LaunchException e) { | ||||
| exitCode=-1; | |||||
| System.err.println(e.getMessage()); | System.err.println(e.getMessage()); | ||||
| } catch (Throwable t) { | } catch (Throwable t) { | ||||
| t.printStackTrace(); | |||||
| exitCode=-1; | |||||
| t.printStackTrace(System.err); | |||||
| } | |||||
| if(exitCode!=0) { | |||||
| System.exit(exitCode); | |||||
| } | } | ||||
| } | } | ||||
| /** | /** | ||||
| * Add a CLASSPATH or -lib to lib path urls. | * Add a CLASSPATH or -lib to lib path urls. | ||||
| * | * | ||||
| @@ -138,17 +146,19 @@ public class Launcher { | |||||
| * Run the launcher to launch Ant. | * Run the launcher to launch Ant. | ||||
| * | * | ||||
| * @param args the command line arguments | * @param args the command line arguments | ||||
| * | |||||
| * @return an exit code. As the normal ant main calls exit when it ends, | |||||
| * this is for handling failures at bind-time | |||||
| * @exception MalformedURLException if the URLs required for the classloader | * @exception MalformedURLException if the URLs required for the classloader | ||||
| * cannot be created. | * cannot be created. | ||||
| */ | */ | ||||
| private void run(String[] args) | |||||
| private int run(String[] args) | |||||
| throws LaunchException, MalformedURLException { | throws LaunchException, MalformedURLException { | ||||
| String antHomeProperty = System.getProperty(MagicNames.ANT_HOME); | String antHomeProperty = System.getProperty(MagicNames.ANT_HOME); | ||||
| File antHome = null; | File antHome = null; | ||||
| File sourceJar = Locator.getClassSource(getClass()); | File sourceJar = Locator.getClassSource(getClass()); | ||||
| File jarDir = sourceJar.getParentFile(); | File jarDir = sourceJar.getParentFile(); | ||||
| String mainClassname = MAIN_CLASS; | |||||
| if (antHomeProperty != null) { | if (antHomeProperty != null) { | ||||
| antHome = new File(antHomeProperty); | antHome = new File(antHomeProperty); | ||||
| @@ -192,6 +202,12 @@ public class Launcher { | |||||
| noUserLib = true; | noUserLib = true; | ||||
| } else if (args[i].equals("--noclasspath") || args[i].equals("-noclasspath")) { | } else if (args[i].equals("--noclasspath") || args[i].equals("-noclasspath")) { | ||||
| noClassPath = true; | noClassPath = true; | ||||
| } else if (args[i].equals("-main")) { | |||||
| if (i == args.length - 1) { | |||||
| throw new LaunchException("The -main argument must " | |||||
| + "be followed by a library location"); | |||||
| } | |||||
| mainClassname = args[++i]; | |||||
| } else { | } else { | ||||
| argList.add(args[i]); | argList.add(args[i]); | ||||
| } | } | ||||
| @@ -273,19 +289,24 @@ public class Launcher { | |||||
| URLClassLoader loader = new URLClassLoader(jars); | URLClassLoader loader = new URLClassLoader(jars); | ||||
| Thread.currentThread().setContextClassLoader(loader); | Thread.currentThread().setContextClassLoader(loader); | ||||
| Class mainClass = null; | Class mainClass = null; | ||||
| int exitCode=0; | |||||
| try { | try { | ||||
| mainClass = loader.loadClass(MAIN_CLASS); | |||||
| mainClass = loader.loadClass(mainClassname); | |||||
| AntMain main = (AntMain) mainClass.newInstance(); | AntMain main = (AntMain) mainClass.newInstance(); | ||||
| main.startAnt(newArgs, null, null); | main.startAnt(newArgs, null, null); | ||||
| } catch (InstantiationException ex) { | } catch (InstantiationException ex) { | ||||
| System.out.println( | |||||
| "Incompatible version of org.apache.tools.ant detected"); | |||||
| System.err.println( | |||||
| "Incompatible version of "+mainClassname+" detected"); | |||||
| File mainJar = Locator.getClassSource(mainClass); | File mainJar = Locator.getClassSource(mainClass); | ||||
| System.out.println( | |||||
| System.err.println( | |||||
| "Location of this class " + mainJar); | "Location of this class " + mainJar); | ||||
| exitCode=-1; | |||||
| } catch (Throwable t) { | } catch (Throwable t) { | ||||
| t.printStackTrace(); | |||||
| t.printStackTrace(System.err); | |||||
| exitCode=-1; | |||||
| } | } | ||||
| return exitCode; | |||||
| } | } | ||||
| } | } | ||||