2009-11-11 8 views
2

Je cherche à pot exécutable compresseur YUI de Yahoo et ils ont cette classe, liée à partir du fichier Manifest comme « Main-Class »:Java exécutable jar. Que fait ce morceau de code?

package com.yahoo.platform.yui.compressor; 

import java.lang.reflect.Method; 

public class Bootstrap { 

    public static void main(String args[]) throws Exception { 
     ClassLoader loader = new JarClassLoader(); 
     Thread.currentThread().setContextClassLoader(loader); 
     Class c = loader.loadClass(YUICompressor.class.getName()); 
     Method main = c.getMethod("main", new Class[]{String[].class}); 
     main.invoke(null, new Object[]{args}); 
    } 
} 

qui ressemble à un emballage inutile pour moi. Pourquoi ne pas simplement mettre YUICompressor en tant que Main-Class? Y a-t-il une raison de le faire de cette façon?

Merci.

Répondre

5

Ils sont en train de charger YUICompressor en utilisant un chargeur de classe personnalisé (le new JarClassLoader() morceau de code). Voir YUI Compressor and Java Class Loader pour la raison derrière cela.

1

Cela semble créer un chargeur de classe complètement nouveau. C'est un mécanisme (imparfait) pour charger des copies indépendantes de classes dans la même JVM en cours d'exécution. Si le composant YUI utilise beaucoup de variables statiques, par exemple, cela peut être une tentative de contourner ce problème, car les variables statiques sont ClassLoader.

1

Peut-être qu'ils voulaient établir le contenu ClassLoader pour le thread principal comme un distinct du comportement par défaut. Voir la documentation pour Thread#getContextClassLoader().

1

L'ingrédient actif ici est le JarClassLoader. Ceci est capable de donner à votre méthode principale un nouvel environnement où les classes et les autres composants de ressources pour le chemin de classe, peuvent être chargés depuis (probablement) hors du fichier jar dans lequel tout se déroule.

Ce type d'ondulation manuelle est utilisé par des méthodes telles que BigJar, qui vous permet de fusionner un ensemble de fichiers jar en un grand fichier exécutable (d'où le nom).

Et oui, la mise en place d'un nouveau classloader est pratiquement le seul moyen d'y parvenir.