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.Properties; | |||
| import java.util.Vector; | |||
| import java.util.HashMap; | |||
| import org.apache.tools.ant.input.DefaultInputHandler; | |||
| import org.apache.tools.ant.input.InputHandler; | |||
| import org.apache.tools.ant.launch.AntMain; | |||
| @@ -271,7 +273,7 @@ public class Main implements AntMain { | |||
| /** | |||
| * 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. | |||
| * | |||
| * @param args the command line arguments. | |||
| @@ -282,6 +284,15 @@ public class Main implements AntMain { | |||
| String searchForThis = 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 | |||
| for (int i = 0; i < args.length; i++) { | |||
| @@ -431,7 +442,7 @@ public class Main implements AntMain { | |||
| throw new BuildException( | |||
| "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 | |||
| //we could ignore it, but there are likely to be other | |||
| //version problems, so we stamp down on the configuration now | |||
| @@ -445,7 +456,7 @@ public class Main implements AntMain { | |||
| } else if (arg.startsWith("-")) { | |||
| // we don't have any more args to recognize! | |||
| String msg = "Unknown argument: " + arg; | |||
| System.out.println(msg); | |||
| System.err.println(msg); | |||
| printUsage(); | |||
| throw new BuildException(""); | |||
| } else { | |||
| @@ -835,7 +846,9 @@ public class Main implements AntMain { | |||
| 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" + 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()); | |||
| } | |||
| @@ -95,16 +95,24 @@ public class Launcher { | |||
| * @param args commandline arguments | |||
| */ | |||
| public static void main(String[] args) { | |||
| int exitCode; | |||
| try { | |||
| Launcher launcher = new Launcher(); | |||
| launcher.run(args); | |||
| exitCode=launcher.run(args); | |||
| } catch (LaunchException e) { | |||
| exitCode=-1; | |||
| System.err.println(e.getMessage()); | |||
| } 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. | |||
| * | |||
| @@ -138,17 +146,19 @@ public class Launcher { | |||
| * Run the launcher to launch Ant. | |||
| * | |||
| * @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 | |||
| * cannot be created. | |||
| */ | |||
| private void run(String[] args) | |||
| private int run(String[] args) | |||
| throws LaunchException, MalformedURLException { | |||
| String antHomeProperty = System.getProperty(MagicNames.ANT_HOME); | |||
| File antHome = null; | |||
| File sourceJar = Locator.getClassSource(getClass()); | |||
| File jarDir = sourceJar.getParentFile(); | |||
| String mainClassname = MAIN_CLASS; | |||
| if (antHomeProperty != null) { | |||
| antHome = new File(antHomeProperty); | |||
| @@ -192,6 +202,12 @@ public class Launcher { | |||
| noUserLib = true; | |||
| } else if (args[i].equals("--noclasspath") || args[i].equals("-noclasspath")) { | |||
| 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 { | |||
| argList.add(args[i]); | |||
| } | |||
| @@ -273,19 +289,24 @@ public class Launcher { | |||
| URLClassLoader loader = new URLClassLoader(jars); | |||
| Thread.currentThread().setContextClassLoader(loader); | |||
| Class mainClass = null; | |||
| int exitCode=0; | |||
| try { | |||
| mainClass = loader.loadClass(MAIN_CLASS); | |||
| mainClass = loader.loadClass(mainClassname); | |||
| AntMain main = (AntMain) mainClass.newInstance(); | |||
| main.startAnt(newArgs, null, null); | |||
| } 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); | |||
| System.out.println( | |||
| System.err.println( | |||
| "Location of this class " + mainJar); | |||
| exitCode=-1; | |||
| } catch (Throwable t) { | |||
| t.printStackTrace(); | |||
| t.printStackTrace(System.err); | |||
| exitCode=-1; | |||
| } | |||
| return exitCode; | |||
| } | |||
| } | |||