Frage

Ich schaue auf Yahoo's Yui Compressor Executable Jar und sie haben diese Klasse, die aus der Manifestdatei als "Hauptklasse" verknüpft ist:

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});
    }
}

Was für mich wie ein nutzloser Wrapper aussieht. Warum nicht einfach direkt einsetzen YUICompressor Als Hauptklasse? Gibt es einen Grund, dies so zu tun?

Vielen Dank.

War es hilfreich?

Lösung

Sie laden YUICompressor Verwenden eines benutzerdefinierten Klassenladers (der new JarClassLoader() Code). Sehen Yui -Kompressor und Java -Klassenlader Für die Begründung dahinter.

Andere Tipps

Dies scheint zu sein, einen völlig neuen Klassenlader zu erstellen. Dies ist ein (unvollständiger) Mechanismus zum Laden unabhängiger Kopien von Klassen in das gleiche laufende JVM.

Wenn das Yui-Zeug beispielsweise viele statische Variablen verwendet, könnte dies ein Versuch sein, dies zu umgehen, da statische Variablen per-ClassLoader.

Vielleicht wollten sie den Inhalt festlegen ClassLoader Für den Hauptfaden als ein Verhalten des Standardverhaltens. Siehe die Dokumentation für Thread#getContextClassLoader().

Der Wirkstoff hier ist der Jarclassloader. Dies ist in der Lage, Ihrer Hauptmethode eine ganz neue Umgebung zu geben, in der Klassen und andere Ressourcenkomponenten für den Klassenpfad aus (wahrscheinlich) aus der JAR -Datei geladen werden können.

Diese Art von Handwedeln wird von Schemata wie Bigjar verwendet, mit denen Sie eine Reihe von JAR-Dateien in ein großes (daher der Name) ausführbares Glas zusammenführen können.

Und ja, ein ganz neuer Klassenloader einzurichten ist praktisch der einzige Weg, dies zu erreichen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top