/* From http://java.sun.com/docs/books/tutorial/index.html */
import java.
lang.
reflect.
Method;
/**
* Runs a jar application from any url. Usage is 'java JarRunner url [args..]'
* where url is the url of the jar file and args is optional arguments to be
* passed to the application's main method.
*/
public class JarRunner {
public static void main
(String[] args
) { if (args.length < 1) {
usage();
}
try {
fatal("Invalid URL: " + args[0]);
}
// Create the class loader for the application jar file
JarClassLoader cl = new JarClassLoader(url);
// Get the application's main class name
try {
name = cl.getMainClassName();
System.
err.
println("I/O error while loading JAR file:");
e.printStackTrace();
}
if (name == null) {
fatal("Specified jar file does not contain a 'Main-Class'"
+ " manifest attribute");
}
// Get arguments for the application
System.
arraycopy(args,
1, newArgs,
0, newArgs.
length);
// Invoke application's main class
try {
cl.invokeClass(name, newArgs);
fatal("Class not found: " + name);
fatal("Class does not define a 'main' method: " + name);
e.getTargetException().printStackTrace();
}
}
private static void fatal
(String s
) { }
private static void usage() {
fatal("Usage: java JarRunner url [args..]");
}
}
/**
* A class loader for loading jar files, both local and remote.
*/
/**
* Creates a new JarClassLoader for the specified url.
*
* @param url
* the url of the jar file
*/
public JarClassLoader
(URL url
) { super(new URL[] { url
});
this.url = url;
}
/**
* Returns the name of the jar file main class, or null if no "Main-Class"
* manifest attributes was defined.
*/
URL u =
new URL("jar",
"", url +
"!/");
}
/**
* Invokes the application in this jar file given the name of the main class
* and an array of arguments. The class must define a static method "main"
* which takes an array of String arguemtns and is of return type "void".
*
* @param name
* the name of the main class
* @param args
* the arguments for the application
* @exception ClassNotFoundException
* if the specified class could not be found
* @exception NoSuchMethodException
* if the specified class does not contain a "main" method
* @exception InvocationTargetException
* if the application raised an exception
*/
Class c = loadClass
(name
);
Method m = c.
getMethod("main",
new Class[] { args.
getClass() });
m.setAccessible(true);
int mods = m.getModifiers();
if (m.
getReturnType() !=
void.
class || !
Modifier.
isStatic(mods
) }
try {
m.
invoke(null,
new Object[] { args
});
// This should not happen, as we have disabled access checks
}
}
}