l’utilisation de la classe se fait comme suit:
ExécuteurJar url [args..]
d’où ‘url’ représente le lien du fichier ‘Jar’ à exécuter et ‘args’ qui est optionnel
représente les arguments à passer en ligne de commande.
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.net.JarURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.jar.Attributes;
/**
* Exécuter un fichier Jar à partir d'un lien:
* l'utilisation de la classe est ExécuteurJar url [args..]
* d'où url est le lien du fichier Jar et args qui est optionnel
* est les arguments à passer à la méthode principale.
*/
public class ExécuteurJar {
public static void main(String[] args) {
if (args.length < 1) {
usage();
}
URL url = null;
try {
url = new URL(args[0]);
} catch (MalformedURLException e) {
fatal("URL Invalid: " + args[0]);
}
// Création de la classe loader pour le fichier jar
ClassLoaderJAR cl = new ClassLoaderJAR(url);
// Obtenir le nom de la classe principale
String name = null;
try {
name = cl.getMainClassName();
} catch (IOException e) {
System.err.println("Erreur d' E/S pendant le chargement de fichier JAR:");
e.printStackTrace();
System.exit(1);
}
if (name == null) {
fatal("Le fichier JAR spécifié ne contient pas de classe principale");
}
// Lire les arguments de l'application
String[] newArgs = new String[args.length - 1];
System.arraycopy(args, 1, newArgs, 0, newArgs.length);
// Invoque la classe principale de l'application
try {
cl.invokeClass(name, newArgs);
} catch (ClassNotFoundException e) {
fatal("Classe introuvable: " + name);
} catch (NoSuchMethodException e) {
fatal("Aucune méthode principale trouvée!: " + name);
} catch (InvocationTargetException e) {
e.getTargetException().printStackTrace();
System.exit(1);
}
}
private static void fatal(String s) {
System.err.println(s);
System.exit(1);
}
private static void usage() {
fatal("Exemple d'utilisation: java ExécuteurJar url [args..]");
}
}
/**
* Création d'une classe Loader pour les Fichiers JAR
*/
class ClassLoaderJAR extends URLClassLoader {
private URL url;
/**
* Créer un nouveau ClassLoaderJAR pour l'URL spécifié
* @param url
* url de fichier jar
*/
public ClassLoaderJAR(URL url) {
super(new URL[] { url });
this.url = url;
}
/**
*
* Cette méthode retourne le nom de la classe principale, ou null s'il n'existe pas de classe principale
*/
public String getMainClassName() throws IOException {
URL u = new URL("jar", "", url + "!/");
JarURLConnection uc = (JarURLConnection) u.openConnection();
Attributes attr = uc.getMainAttributes();
return attr != null ? attr.getValue(Attributes.Name.MAIN_CLASS) : null;
}
public void invokeClass(String name, String[] args)
throws ClassNotFoundException, NoSuchMethodException,
InvocationTargetException {
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)
|| !Modifier.isPublic(mods)) {
throw new NoSuchMethodException("main");
}
try {
m.invoke(null, new Object[] { args });
} catch (IllegalAccessException e) {
}
}
}