Allow main(String[]) to be an instance method

This way commands can extend a base class, which provides a standard
main implementation, such as to launch a command line parser and then
invoke the real logic from some other method.

Optionally, main may now return a numeric value, which becomes the
JVM's exit code.

Signed-off-by: Shawn O. Pearce <sop@google.com>
diff --git a/pom.xml b/pom.xml
index 6827c3f..b368e1a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -21,7 +21,7 @@
   <groupId>gerrit</groupId>
   <artifactId>executablewar</artifactId>
   <packaging>jar</packaging>
-  <version>1.0</version>
+  <version>1.1</version>
   <name>executablewar</name>
   <description>Support for running code directly from WAR files</description>
   <url>http://android.git.kernel.org/?p=tools/executablewar.git</url>
diff --git a/src/main/java/ExecutableWarMain.java b/src/main/java/ExecutableWarMain.java
index 781787e..4d2e8fb 100644
--- a/src/main/java/ExecutableWarMain.java
+++ b/src/main/java/ExecutableWarMain.java
@@ -18,6 +18,7 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.net.URLClassLoader;
@@ -166,7 +167,17 @@
       return;
     }
 
-    main.invoke(null, new Object[] {argv});
+    final Object res;
+    if ((main.getModifiers() & Modifier.STATIC) == Modifier.STATIC) {
+      res = main.invoke(null, new Object[] {argv});
+    } else {
+      res = main.invoke(clazz.newInstance(), new Object[] {argv});
+    }
+    if (res instanceof Number) {
+      System.exit(((Number) res).intValue());
+    } else {
+      System.exit(0);
+    }
   }
 
   private static Attributes myManifest() throws IOException,