Erweiterungen für Klassenladeprogramm verwenden

Letzte Aktualisierung: 9. Dezember 2002

Eclipse 2.1 enthält viele Leistungserweiterungen, darunter einige im Bereich des Ladens von Klassen. Zu diesem Zweck wurden zur Plug-in-Manifestdatei Konfigurationsbefehle hinzugefügt. Die vorliegende Datei erläutert ihre Verwendung.

Aktivierung

Die Leistungserweiterungen für Klassenladeprogramme werden standardmäßig automatisch hinzugefügt. Wenn der Benutzer dieses Verhalten überschreiben und sie inaktivieren möchte, muss er das Befehlszeilenargument -noPackagePrefixes an die ausführbare Datei von Eclipse übergeben.

Format

Die Deklaration der Paketpräfixe in der Plug-in-Manifestdatei wird durch ein Element packages für jede Bibliothek angegeben, die in der Datei deklariert ist. Für das Element packages gibt es ein Attribut prefixes, das die Paketpräfixe für diese Bibliothek auflistet.

Es ist gängige Praxis, dass JAR-Dateien Code enthalten, der sich in mehreren Paketen befindet. Beispielsweise enthält das Plug-in org.eclipse.core.runtime Code, der aus den folgenden Paketen stammt:
    org.eclipse.core.runtime
    org.eclipse.core.internal.runtime,
    org.eclipse.core.internal.plugins
    org.eclipse.core.runtime.model
.

In diesem Fall gibt die Datei plugin.xml Folgendes an:

    <runtime>
        <library name="runtime.jar">
            <export name="*"/>
            <packages prefixes="org.eclipse.core"/>
        </library>
    </runtime>

Bitte beachten Sie, dass org.eclipse.core ein allgemeines Präfix für alle Pakete im Plug-in ist. Alternativ können Sie auch alle 4 Präfixe in einer Datei als Liste mit Kommatrennzeichen deklarieren. In diesem Fall muss zwischen dem Aufwand, der durch die erforderliche Anzahl von Prüfungen bei mehreren Einträgen verursacht wird, und dem Risiko eines Präfixes, das möglicherweise falsche Angaben enthält, abgewogen werden. Abhängig davon, wie Ihr Code strukturiert ist, kann es unter Umständen besser sein, bis zu 5-10 Präfixe aufzulisten, statt ein allgemeineres Präfix zu verwenden. Falls Ihr gesamter Code über mehrere Plug-ins hinweg beispielsweise dasselbe Präfix (z. B. com.mycompany) enthält, können Sie nicht alle Vorteile nutzen, wenn Sie in der Datei nur das einzige Präfix "com.mycompany" auflisten.

Wenn ein Plug-in mehrere Bibliotheksdeklarationen enthält, sollte jede die Paketpräfixe aus ihrer JAR berücksichtigen.

Falls Sie in Ihr Plug-in-Manifest kein Element packages aufnehmen, ist Ihr Code zwar weiterhin funktionsfähig, nutzt jedoch nicht die Optimierung für das Laden von Klassen. Bitte beachten Sie, dass die Liste der Paketpräfixe für alle Pakete in allen Bibliotheken des Plug-ins vollständig sein muss. Wenn diese Liste unvollständig ist, funktioniert der Code nicht.

Verwendung mit Eigenschaftsdatei für Klassenladeprogramm

In Eclipse 2.0.2 und früheren Erstellungen der Integration von Eclipse 2.1 wurde eine Komponente hinzugefügt, mit deren Hilfe der Benutzer eine Eigenschaftsdatei für das Klassenladeprogramm angeben konnte, die die Paketpräfixe für die Erweiterungen der Klassenladeprogramme enthielt. Die Verwendung dieser Datei ist in dem Abschnitt angegeben, der aufgerufen wird, wenn Sie hier klicken.

Eclipse 2.1 ist mit der Eigenschaftsdatei für Klassenladeprogramme vollständig abwärtskompatibel und kann in der Tat zusammen mit den Paketpräfixdeklarationen im Plug-in-Manifest verwendet werden. Dieser Abschnitt beschreibt das Interaktionsverhalten dieser beiden Mechanismen.

Standardverhalten (ohne Befehlszeilenargumente): Die Paketpräfixe werden aus der Datei plugin.xml gelesen und auf die Strategie für das Laden von Klassen angewendet. Auf die Datei classloader.properties wird nicht zugegriffen, und sie wird nicht berücksichtigt.

Verwendung des Arguments "-classloaderProperties": Die Paketpräfixe werden aus der Datei plugin.xml gelesen, und anschließend wird die Datei classloader.properties gelesen. Wenn die Eigenschaftsdatei des Klassenladeprogramms einen Eintrag für ein Plug-in enthält, das Präfixe in der Manifestdatei definiert hat, überschreibt der Eintrag in der Eigenschaftsdatei diese Einträge und hat Vorrang. (Die Ergebnisse werden NICHT gemischt.) Falls der Eintrag in der Eigenschaftsdatei keinen Wert enthält (z. B. org.eclipse.core.runtime=), werden alle in der Manifestdatei deklarierten Präfixe entfernt, und die Strategie für das Laden von Klassen verwendet die Erweiterungen standardmäßig nicht.

Verwendung des Arguments "-noPackagePrefixes": Alle in der Plug-in-Manifestdatei deklarierten Paketpräfixe werden ignoriert, und auch die Eigenschaftsdatei des Klassenladeprogramms wird nicht berücksichtigt. Die Strategie für das Laden von Klassen verwendet die Präfixerweiterungen standardmäßig nicht.

Verwendung beider Argumente ("-classloaderProperties" und "-noPackagePrefixes"): Alle Paketdeklarationen in der Plug-in-Manifestdatei werden ignoriert. Die Eigenschaftsdatei des Klassenladeprogramms wird gelesen, und alle in dieser Datei definierten Deklarationen werden beim Laden von Klassen berücksichtigt.

Fehlerbehebung

Falls Sie eine Ausnahmebedingung java.lang.ClassNotFoundException empfangen, ist dies ein Hinweis darauf, dass möglicherweise ein Problem im Zusammenhang mit den Einträgen in der Manifest- oder der Eigenschaftsdatei vorliegt. Versuchen Sie, Eclipse mit dem Befehlszeilenargument -noPackagePrefixes auszuführen, und verwenden Sie das Argument -classloaderProperties NICHT. Dies inaktiviert alle Erweiterungen für das Laden von Klassen in Bezug auf Paketpräfixe.

Falls Ihre Code hiernach problemlos ausgeführt wird, enthalten diese Dateien möglicherweise eine korrekte Syntax, aber eventuell fehlen in den Paketpräfixen in der durch Kommata gegliederten Liste einige Einträge. Um dieses Problem zu überprüfen, setzen Sie die entsprechenden Zeilen in der Datei auf Kommentar. Verwenden Sie ein Nummernzeichen (#), um die Zeile des entsprechenden Plug-ins in der Eigenschaftsdatei auf Kommentar zu setzen, oder verwenden Sie HTML-Kommentarzeichen (<!-- ... -->), um die Paketdeklaration in der entsprechenden Datei plugin.xml auf Kommentar zu setzen.

Bekannte Probleme

Wenn eine Plug-in-Manifestdatei die Liste der Paketpräfixe deklariert, müssen alle Fragmente, die sie ergänzen, ebenfalls ihre Paketpräfixe auflisten. Andernfalls wird ein Fehler NoClassDefFoundError verursacht. Dieses Problem kann entweder durch die Inaktivierung der Erweiterungen für das Klassenladeprogramms unter Verwendung des Befehlszeilenarguments -noPackagePrefixes oder durch Hinzufügen der entsprechenden Paketpräfixeinträge zum Plug-in und allen seinen Fragmenten gelöst werden.

Copyright IBM Corporation und Andere 2000, 2003.