ant-notifications mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From hi...@apache.org
Subject svn commit: r1385262 - in /ant/core/trunk: ./ manual/ src/main/org/apache/tools/ant/
Date Sun, 16 Sep 2012 13:42:41 GMT
Author: hibou
Date: Sun Sep 16 13:42:41 2012
New Revision: 1385262

URL: http://svn.apache.org/viewvc?rev=1385262&view=rev
Log:
Add the possibility to register a custom command line argument processor

Added:
    ant/core/trunk/manual/argumentprocessor.html   (with props)
    ant/core/trunk/src/main/org/apache/tools/ant/ArgumentProcessor.java   (with props)
    ant/core/trunk/src/main/org/apache/tools/ant/ArgumentProcessorRegistry.java   (with props)
Modified:
    ant/core/trunk/WHATSNEW
    ant/core/trunk/manual/developlist.html
    ant/core/trunk/manual/running.html
    ant/core/trunk/src/main/org/apache/tools/ant/Main.java

Modified: ant/core/trunk/WHATSNEW
URL: http://svn.apache.org/viewvc/ant/core/trunk/WHATSNEW?rev=1385262&r1=1385261&r2=1385262&view=diff
==============================================================================
--- ant/core/trunk/WHATSNEW (original)
+++ ant/core/trunk/WHATSNEW Sun Sep 16 13:42:41 2012
@@ -93,6 +93,9 @@ Other changes:
  * Make extension point bindable to imported prefixed targets
    Bugzilla Report 53550.
 
+ * Add the possibility to register a custom command line argument processor.
+   See org.apache.tools.ant.ArgumentProcessor and manual/argumentprocessor.html
+
 Changes from Ant 1.8.3 TO Ant 1.8.4
 ===================================
 

Added: ant/core/trunk/manual/argumentprocessor.html
URL: http://svn.apache.org/viewvc/ant/core/trunk/manual/argumentprocessor.html?rev=1385262&view=auto
==============================================================================
--- ant/core/trunk/manual/argumentprocessor.html (added)
+++ ant/core/trunk/manual/argumentprocessor.html Sun Sep 16 13:42:41 2012
@@ -0,0 +1,76 @@
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You 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.
+-->
+<html>
+
+<head>
+<meta http-equiv="Content-Language" content="en-us">
+<link rel="stylesheet" type="text/css" href="stylesheets/style.css">
+<title>The Command Line Processor Plugin: ArgumentProcessor</title>
+</head>
+
+<body>
+<h1>The Command Line Processor Plugin: ArgumentProcessor</h1>
+
+<h2><a name="definition">What is an ArgumentProcessor?</a></h2>
+
+<p>
+An <code>ArgumentProcessor</code> is a parser of command line argument which
is
+then call before and after the build file is being parsed. Third party
+libraries may then be able to have custom argument line argument which modify
+Ant behaviour.
+</p>
+
+<p>
+An <code>ArgumentProcessor</code> is called each time Ant parse an unknown
+argument, an <code>ArgumentProcessor</code> doesn't take precedence over Ant
to
+parse already suported options. It is then recommended to thrid party
+<code>ArgumentProcessor</code> implementation to chose specific 'enough'
+argument name, avoiding for instance one letter arguments.
+</p>
+
+<p>
+It is also called at the different phases so different behaviour can be
+implemented. It is called just after every arguments are parsed, just
+before the project is being configured (the build file being parsed),
+and just after. Some of the methods to be implemented return a boolean:
+if <code>true</code> is returned, Ant will terminate immediatly, without
+error.
+</p>
+
+<p>
+Being called during all these phases, an <code>ArgumentProcessor</code>
+can just print some specific system properties and quit (like
+<code>-diagnose</code>), or print some specific properties of a project after
+being parsed and quit (like <code>-projectHelp</code>), or just set some
+custom properties on the project and let it run.
+</p>
+
+<h2><a name="repository">How to register it's own ArgumentProcessor</a></h2>
+
+<p>First, the <code>ArgumentProcessor</code> must be an implementation
of
+<code>org.apache.tools.ant.ArgumentProcessor</code>.
+</p>
+
+<p>Then to decare it: create a file
+<code>META-INF/services/org.apache.tools.ant.ArgumentProcessor</code> which
+contains only one line the fully qualified name of the class of the
+implementation. This file together with the implementation class need then to
+be found in Ant's classpath.
+</p>
+</body>
+</html>
+

Propchange: ant/core/trunk/manual/argumentprocessor.html
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: ant/core/trunk/manual/argumentprocessor.html
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: ant/core/trunk/manual/argumentprocessor.html
------------------------------------------------------------------------------
    svn:mime-type = text/html

Modified: ant/core/trunk/manual/developlist.html
URL: http://svn.apache.org/viewvc/ant/core/trunk/manual/developlist.html?rev=1385262&r1=1385261&r2=1385262&view=diff
==============================================================================
--- ant/core/trunk/manual/developlist.html (original)
+++ ant/core/trunk/manual/developlist.html Sun Sep 16 13:42:41 2012
@@ -39,6 +39,7 @@
 <li><a href="inputhandler.html">InputHandler</a></li>
 <li><a href="antexternal.html">Using Ant Tasks Outside of Ant</a></li>
 <li><a href="projecthelper.html">The Ant frontend: ProjectHelper</a></li>
+<li><a href="argumentprocessor.html">The Command Line Processor Plugin:ArgumentProcessor</a></li>
 </ul>
 
 <h3>Tutorials</h3>

Modified: ant/core/trunk/manual/running.html
URL: http://svn.apache.org/viewvc/ant/core/trunk/manual/running.html?rev=1385262&r1=1385261&r2=1385262&view=diff
==============================================================================
--- ant/core/trunk/manual/running.html (original)
+++ ant/core/trunk/manual/running.html Sun Sep 16 13:42:41 2012
@@ -445,12 +445,19 @@ org.apache.tools.ant.Executor implementa
 <tr>
   <td><code>org.apache.tools.ant.ProjectHelper</code></td>
   <!-- add the blank after the slash, so the browser can do a line break -->
-  <td>classname (optional, default 'org.apache.tools.ant.ProjectHelper')</td>
+  <td>classname (optional, default 'org.apache.tools.ant.ProjectHelper2')</td>
   <td>specifies the classname to use as ProjectHelper. The class must extend
       org.apache.tools.ant.ProjectHelper.
   </td>
 </tr>
 <tr>
+  <td><code>org.apache.tools.ant.ArgumentProcessor</code></td>
+  <td>classname (optional)</td>
+  <td>specifies the classname to use as ArgumentProcessor. The class must extend
+      org.apache.tools.ant.ArgumentProcessor.
+  </td>
+</tr>
+<tr>
   <td><code>p4.port, p4.client, p4.user</code></td>
   <td>several formats</td>
   <td>Specify defaults for port-, client- and user-setting of the
@@ -477,6 +484,13 @@ org.apache.tools.ant.Executor implementa
   <a href="projecthelper.html#repository">ProjectHelper internal repository</a>.
   </td>
 </tr>
+<tr>
+  <td><code>ant.argument-processor-repo.debug</code></td>
+  <td>boolean (default 'false')</td>
+  <td>Set it to true to enable debugging with Ant's
+  <a href="argumentprocessor.html#repository">ArgumentProcessor internal repository</a>.
+  </td>
+</tr>
 </table>
 
 <p>

Added: ant/core/trunk/src/main/org/apache/tools/ant/ArgumentProcessor.java
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/ArgumentProcessor.java?rev=1385262&view=auto
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/ArgumentProcessor.java (added)
+++ ant/core/trunk/src/main/org/apache/tools/ant/ArgumentProcessor.java Sun Sep 16 13:42:41
2012
@@ -0,0 +1,72 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You 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;
+
+import java.io.PrintStream;
+import java.util.List;
+
+/**
+ * Processor of arguments of the command line.
+ * <p>
+ * Arguments supported by third party code should not conflict with Ant core
+ * ones. It is then recommended to chose specific 'enough' argument name,
+ * avoiding for instance one letter arguments. By the way, if there any
+ * conflict, Ant will take precedence.
+ * 
+ * @since 1.9
+ */
+public interface ArgumentProcessor {
+
+    /**
+     * Read the arguments from the command line at the specified position
+     * <p>
+     * If the argument is not supported, returns -1. Else, the position of the
+     * first argument not supported.
+     */
+    int readArguments(String[] args, int pos);
+
+    /**
+     * If some arguments matched with {@link #readArguments(String[], int)},
+     * this method is called after all arguments were parsed. Returns
+     * <code>true</code> if Ant should stop there, ie the build file not parsed
+     * and the project should not be executed.
+     */
+    boolean handleArg(List<String> args);
+
+    /**
+     * If some arguments matched with {@link #readArguments(String[], int)},
+     * this method is called just before the project being configured
+     */
+    void prepareConfigure(Project project, List<String> args);
+
+    /**
+     * Handle the arguments with {@link #readArguments(String[], int)}, just
+     * after the project being configured. Returns <code>true</code> if Ant
+     * should stop there, ie the build file not parsed and the project should
+     * not be executed.
+     */
+    boolean handleArg(Project project, List<String> arg);
+
+    /**
+     * Print the usage of the supported arguments
+     * 
+     * @see org.apache.tools.ant.Main.printUsage()
+     */
+    void printUsage(PrintStream writer);
+
+}

Propchange: ant/core/trunk/src/main/org/apache/tools/ant/ArgumentProcessor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: ant/core/trunk/src/main/org/apache/tools/ant/ArgumentProcessor.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: ant/core/trunk/src/main/org/apache/tools/ant/ArgumentProcessor.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: ant/core/trunk/src/main/org/apache/tools/ant/ArgumentProcessorRegistry.java
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/ArgumentProcessorRegistry.java?rev=1385262&view=auto
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/ArgumentProcessorRegistry.java (added)
+++ ant/core/trunk/src/main/org/apache/tools/ant/ArgumentProcessorRegistry.java Sun Sep 16
13:42:41 2012
@@ -0,0 +1,168 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You 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;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.List;
+
+import org.apache.tools.ant.util.LoaderUtils;
+
+/**
+ * The global registry for {@link ArgumentProcessor}s.
+ * <p>
+ * An {@link ArgumentProcessor} implementation can be registered via the system
+ * property <code>org.apache.tools.ant.ArgumentProcessor</code>, or via a JDK1.3
+ * 'service', by putting the fully qualified name of the implementation into the
+ * file <code>META-INF/services/org.apache.tools.ant.ArgumentProcessor</code>
+ * <p>
+ * Use the system property <code>ant.argument-processor.debug</code> to enable
+ * the print of debug log.
+ * 
+ * @since 1.9
+ */
+public class ArgumentProcessorRegistry {
+
+    private static final String DEBUG_ARGUMENT_PROCESSOR_REPOSITORY = "ant.argument-processor-repo.debug";
+
+    // The message log level is not accessible here because everything
+    // is instanciated statically
+    private static final boolean DEBUG = "true".equals(System.getProperty(DEBUG_ARGUMENT_PROCESSOR_REPOSITORY));
+
+    private static final String SERVICE_ID = "META-INF/services/org.apache.tools.ant.ArgumentProcessor";
+
+    private static ArgumentProcessorRegistry instance = new ArgumentProcessorRegistry();
+
+    private List<ArgumentProcessor> processors = new ArrayList<ArgumentProcessor>();
+
+    public static ArgumentProcessorRegistry getInstance() {
+        return instance;
+    }
+
+    private ArgumentProcessorRegistry() {
+        collectArgumentProcessors();
+    }
+
+    public List<ArgumentProcessor> getProcessors() {
+        return processors;
+    }
+
+    private void collectArgumentProcessors() {
+        try {
+            ClassLoader classLoader = LoaderUtils.getContextClassLoader();
+            if (classLoader != null) {
+                Enumeration<URL> resources = classLoader.getResources(SERVICE_ID);
+                while (resources.hasMoreElements()) {
+                    URL resource = resources.nextElement();
+                    ArgumentProcessor processor = getProcessorByService(resource.openStream());
+                    registerArgumentProcessor(processor);
+                }
+            }
+
+            InputStream systemResource = ClassLoader.getSystemResourceAsStream(SERVICE_ID);
+            if (systemResource != null) {
+                ArgumentProcessor processor = getProcessorByService(systemResource);
+                registerArgumentProcessor(processor);
+            }
+        } catch (Exception e) {
+            System.err.println("Unable to load ArgumentProcessor from service "
+                    + SERVICE_ID + " (" + e.getClass().getName() + ": "
+                    + e.getMessage() + ")");
+            if (DEBUG) {
+                e.printStackTrace(System.err);
+            }
+        }
+    }
+
+    public void registerArgumentProcessor(String helperClassName)
+            throws BuildException {
+        registerArgumentProcessor(getProcessor(helperClassName));
+    }
+
+    public void registerArgumentProcessor(
+            Class< ? extends ArgumentProcessor> helperClass)
+            throws BuildException {
+        registerArgumentProcessor(getProcessor(helperClass));
+    }
+
+    private ArgumentProcessor getProcessor(String helperClassName) {
+        try {
+            @SuppressWarnings("unchecked")
+            Class< ? extends ArgumentProcessor> cl = (Class< ? extends ArgumentProcessor>)
Class.forName(helperClassName);
+            return getProcessor(cl);
+        } catch (ClassNotFoundException e) {
+            throw new BuildException("Argument processor class "
+                    + helperClassName + " was not found", e);
+        }
+    }
+
+    private ArgumentProcessor getProcessor(
+            Class< ? extends ArgumentProcessor> processorClass) {
+        ArgumentProcessor processor;
+        try {
+            processor = processorClass.getConstructor().newInstance();
+        } catch (Exception e) {
+            throw new BuildException("The argument processor class"
+                    + processorClass.getClass().getName()
+                    + " could not be instanciated with a default constructor",
+                    e);
+        }
+        return processor;
+    }
+
+    public void registerArgumentProcessor(ArgumentProcessor processor) {
+        if (processor == null) {
+            return;
+        }
+        processors.add(processor);
+        if (DEBUG) {
+            System.out.println("Argument processor "
+                    + processor.getClass().getName() + " registered.");
+        }
+    }
+
+    private ArgumentProcessor getProcessorByService(InputStream is)
+            throws IOException {
+        InputStreamReader isr = null;
+        try {
+            try {
+                isr = new InputStreamReader(is, "UTF-8");
+            } catch (java.io.UnsupportedEncodingException e) {
+                isr = new InputStreamReader(is);
+            }
+            BufferedReader rd = new BufferedReader(isr);
+            String processorClassName = rd.readLine();
+            if (processorClassName != null && !"".equals(processorClassName)) {
+                return getProcessor(processorClassName);
+            }
+        } finally {
+            try {
+                isr.close();
+            } catch (IOException e) {
+                // ignore
+            }
+        }
+        return null;
+    }
+
+}

Propchange: ant/core/trunk/src/main/org/apache/tools/ant/ArgumentProcessorRegistry.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: ant/core/trunk/src/main/org/apache/tools/ant/ArgumentProcessorRegistry.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: ant/core/trunk/src/main/org/apache/tools/ant/ArgumentProcessorRegistry.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: ant/core/trunk/src/main/org/apache/tools/ant/Main.java
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/Main.java?rev=1385262&r1=1385261&r2=1385262&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/Main.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/Main.java Sun Sep 16 13:42:41 2012
@@ -24,12 +24,15 @@ import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.PrintStream;
+import java.io.PrintWriter;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Properties;
@@ -152,6 +155,7 @@ public class Main implements AntMain {
      */
     private boolean proxy = false;
 
+    private Map<Class<?>, List<String>> extraArguments = new HashMap<Class<?>,
List<String>>();
 
     private static final GetProperty NOPROPERTIES = new GetProperty(){
         public Object getProperty(String aName) {
@@ -324,6 +328,8 @@ public class Main implements AntMain {
         boolean justPrintVersion = false;
         boolean justPrintDiagnostics = false;
 
+        ArgumentProcessorRegistry processorRegistry = ArgumentProcessorRegistry.getInstance();
+        
         for (int i = 0; i < args.length; i++) {
             String arg = args[i];
 
@@ -399,11 +405,29 @@ public class Main implements AntMain {
             } else if (arg.equals("-autoproxy")) {
                 proxy = true;
             } else if (arg.startsWith("-")) {
-                // we don't have any more args to recognize!
-                String msg = "Unknown argument: " + arg;
-                System.err.println(msg);
-                printUsage();
-                throw new BuildException("");
+                boolean processed = false;
+                for (ArgumentProcessor processor : processorRegistry.getProcessors()) {
+                    int newI = processor.readArguments(args, i);
+                    if (newI != -1) {
+                        List<String> extraArgs = extraArguments.get(processor.getClass());
+                        if (extraArgs == null) {
+                            extraArgs = new ArrayList<String>();
+                            extraArguments.put(processor.getClass(), extraArgs);
+                        }
+                        for (; i < newI && i < args.length; i++) {
+                            extraArgs.add(args[i]);
+                        }
+                        processed = true;
+                        break;
+                    }
+                }
+                if (!processed) {
+                    // we don't have any more args to recognize!
+                    String msg = "Unknown argument: " + arg;
+                    System.err.println(msg);
+                    printUsage();
+                    throw new BuildException("");
+                }
             } else {
                 // if it's no other arg, it may be the target
                 targets.addElement(arg);
@@ -726,6 +750,17 @@ public class Main implements AntMain {
             return;
         }
 
+        ArgumentProcessorRegistry processorRegistry = ArgumentProcessorRegistry.getInstance();
+
+        for (ArgumentProcessor processor : processorRegistry.getProcessors()) {
+            List<String> extraArgs = extraArguments.get(processor.getClass());
+            if (extraArgs != null) {
+                if (processor.handleArg(extraArgs)) {
+                    return;
+                }
+            }
+        }
+
         final Project project = new Project();
         project.setCoreLoader(coreLoader);
 
@@ -781,8 +816,24 @@ public class Main implements AntMain {
                     proxySetup.enableProxies();
                 }
 
+                for (ArgumentProcessor processor : processorRegistry.getProcessors()) {
+                    List<String> extraArgs = extraArguments.get(processor.getClass());
+                    if (extraArgs != null) {
+                        processor.prepareConfigure(project, extraArgs);
+                    }
+                }
+
                 ProjectHelper.configureProject(project, buildFile);
 
+                for (ArgumentProcessor processor : processorRegistry.getProcessors()) {
+                    List<String> extraArgs = extraArguments.get(processor.getClass());
+                    if (extraArgs != null) {
+                        if (processor.handleArg(project, extraArgs)) {
+                            return;
+                        }
+                    }
+                }
+
                 if (projectHelp) {
                     printDescription(project);
                     printTargets(project, msgOutputLevel > Project.MSG_INFO,
@@ -954,50 +1005,45 @@ public class Main implements AntMain {
      * Prints the usage information for this class to <code>System.out</code>.
      */
     private static void printUsage() {
-        String lSep = System.getProperty("line.separator");
-        StringBuffer msg = new StringBuffer();
-        msg.append("ant [options] [target [target2 [target3] ...]]" + lSep);
-        msg.append("Options: " + lSep);
-        msg.append("  -help, -h              print this message" + lSep);
-        msg.append("  -projecthelp, -p       print project help information" + lSep);
-        msg.append("  -version               print the version information and exit" + lSep);
-        msg.append("  -diagnostics           print information that might be helpful to"
+ lSep);
-        msg.append("                         diagnose or report problems." + lSep);
-        msg.append("  -quiet, -q             be extra quiet" + lSep);
-        msg.append("  -silent, -S            print nothing but task outputs and build failures"
+ lSep);
-        msg.append("  -verbose, -v           be extra verbose" + lSep);
-        msg.append("  -debug, -d             print debugging information" + lSep);
-        msg.append("  -emacs, -e             produce logging information without adornments"
-                   + lSep);
-        msg.append("  -lib <path>            specifies a path to search for jars and
classes"
-                   + lSep);
-        msg.append("  -logfile <file>        use given file for log" + lSep);
-        msg.append("    -l     <file>                ''" + lSep);
-        msg.append("  -logger <classname>    the class which is to perform logging"
+ lSep);
-        msg.append("  -listener <classname>  add an instance of class as a project
listener"
-                   + lSep);
-        msg.append("  -noinput               do not allow interactive input" + lSep);
-        msg.append("  -buildfile <file>      use given buildfile" + lSep);
-        msg.append("    -file    <file>              ''" + lSep);
-        msg.append("    -f       <file>              ''" + lSep);
-        msg.append("  -D<property>=<value>   use value for given property" +
lSep);
-        msg.append("  -keep-going, -k        execute all targets that do not depend" + lSep);
-        msg.append("                         on failed target(s)" + lSep);
-        msg.append("  -propertyfile <name>   load all properties from file with -D"
+ lSep);
-        msg.append("                         properties taking precedence" + lSep);
-        msg.append("  -inputhandler <class>  the class which will handle input requests"
+ lSep);
-        msg.append("  -find <file>           (s)earch for buildfile towards the root
of" + lSep);
-        msg.append("    -s  <file>           the filesystem and use it" + lSep);
-        msg.append("  -nice  number          A niceness value for the main thread:" + lSep
-                   + "                         1 (lowest) to 10 (highest); 5 is the default"
-                   + 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" + lSep);
-        msg.append("  -autoproxy             Java1.5+: use the OS proxy settings"
-                + lSep);
-        msg.append("  -main <class>          override Ant's normal entry point");
-        System.out.println(msg.toString());
+        System.out.println("ant [options] [target [target2 [target3] ...]]");
+        System.out.println("Options: ");
+        System.out.println("  -help, -h              print this message");
+        System.out.println("  -projecthelp, -p       print project help information");
+        System.out.println("  -version               print the version information and exit");
+        System.out.println("  -diagnostics           print information that might be helpful
to");
+        System.out.println("                         diagnose or report problems.");
+        System.out.println("  -quiet, -q             be extra quiet");
+        System.out.println("  -silent, -S            print nothing but task outputs and build
failures");
+        System.out.println("  -verbose, -v           be extra verbose");
+        System.out.println("  -debug, -d             print debugging information");
+        System.out.println("  -emacs, -e             produce logging information without
adornments");
+        System.out.println("  -lib <path>            specifies a path to search for
jars and classes");
+        System.out.println("  -logfile <file>        use given file for log");
+        System.out.println("    -l     <file>                ''");
+        System.out.println("  -logger <classname>    the class which is to perform
logging");
+        System.out.println("  -listener <classname>  add an instance of class as a
project listener");
+        System.out.println("  -noinput               do not allow interactive input");
+        System.out.println("  -buildfile <file>      use given buildfile");
+        System.out.println("    -file    <file>              ''");
+        System.out.println("    -f       <file>              ''");
+        System.out.println("  -D<property>=<value>   use value for given property");
+        System.out.println("  -keep-going, -k        execute all targets that do not depend");
+        System.out.println("                         on failed target(s)");
+        System.out.println("  -propertyfile <name>   load all properties from file
with -D");
+        System.out.println("                         properties taking precedence");
+        System.out.println("  -inputhandler <class>  the class which will handle input
requests");
+        System.out.println("  -find <file>           (s)earch for buildfile towards
the root of");
+        System.out.println("    -s  <file>           the filesystem and use it");
+        System.out.println("  -nice  number          A niceness value for the main thread:"
+                + "                         1 (lowest) to 10 (highest); 5 is the default");
+        System.out.println("  -nouserlib             Run ant without using the jar files
from"
+                + "                         ${user.home}/.ant/lib");
+        System.out.println("  -noclasspath           Run ant without using CLASSPATH");
+        System.out.println("  -autoproxy             Java1.5+: use the OS proxy settings");
+        System.out.println("  -main <class>          override Ant's normal entry point");
+        for (ArgumentProcessor processor : ArgumentProcessorRegistry.getInstance().getProcessors())
{
+            processor.printUsage(System.out);
+        }
     }
 
     /**



Mime
View raw message