使用類別載入器的加強功能

前次更新時間:2002 年 12 月 9 日

Eclipse 2.1 包括許多效能加強功能,包括類別載入區域中的某些加強功能。 為了協助您徹底瞭解,已將標記新增至外掛程式 manifest 檔, 這個檔案正是用來說明它的使用情形。

啟動

依預設,會自動啟用類別載入器效能的加強功能。 如果使用者想要置換這個行為並停用它們,它們可以將 -noPackagePrefixes 指令行引數傳遞至 Eclipse 執行檔。

格式

在檔案中宣告的每一個程式庫的 packages 元素,指出已在外掛程式 manifest 檔中宣告套件字首。packages 元素具有 prefixes 屬性, 用來列出該程式庫的套件字首。

Jar 檔含有存在於多個套件的程式碼是相當常見的。 舉例來說,org.eclipse.core.runtime 外掛程式含有下列套件的程式碼:
    org.eclipse.core.runtime
    org.eclipse.core.internal.runtime,
    org.eclipse.core.internal.plugins
    org.eclipse.core.runtime.model
.

在這種情況中,plugin.xml 指定:

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

請注意,org.eclipse.core 是外掛程式中所有套件共用的字首。 替代方案就是將檔案中的 4 個字首全都宣告成以逗號區隔的清單。 在這種情況中,使用者必須權衡對於多個項目所需的檢查次數與一個可以包括失敗命中數的字首之間的平衡。根據您程式碼的結構方式,最好列出 5-10 個套件字首,而非伴隨更普通的字首。 舉例來說,如果您的跨多個外掛程式的所有程式碼都含有相同字首(如 com.mycompany), 則當您僅列出檔案中的單一字首 "com.mycompany" 時,將無法充分利用所有的好處。

當外掛程式含有多個程式庫宣告時,每一個都應該說明來自其 jar 的套件字首。

如果您選擇不將任何 packages 元素併入在您的外掛程式 Manifest 中, 則您的程式碼仍將運作,但您將無法利用類別載入最佳化。 請注意,對於您外掛程式中位於所有程式庫的所有套件而言,您的套件字首清單必須是完整的。如果這個清單不完整,您的程式碼將無法運作。

搭配類別載入器內容檔使用

在 Eclipse 2.0.2 和舊版的「Eclipse 2.1 整合」建置中,已新增一個特性,以容許使用者指定類別載入器內容檔,其含有套件字首以啟用類別載入器的加強功能。 此處指定如何使用這個檔案。

Eclipse 2.1 是完全與舊版的類別載入器內容檔相容,而且,事實上它可以與外掛程式 Manifest 中的套件字首宣告一起使用。本節說明這兩個機制之間交談的行為。

預設行為:(沒有指令行引數)將從 plugin.xml 檔中讀取套件字首,而且套用至類別載入策略。 系統不會存取或考慮 classloader.properties 檔。

使用 -classloaderProperties:plugin.xml 檔讀取套件字首, 然後讀取 classloader.properties 檔。如果類別載入器內容檔中具有一個項目,代表具有在 manifest 檔中定義之字首的外掛程式,則內容檔中的項目將置換並取得優先處理順序。 (不合併結果)如果內容檔中的項目未含有值(如 org.eclipse.core.runtime=), 則任何在 manifest 檔中宣告的字首將移除,而且類別載入策略將預設為不使用加強功能。

使用 -noPackagePrefixes:任何在外掛程式 manifest 檔中宣告的套件字首將予以忽略, 而且類別載入器內容檔也不會列入考慮。類別載入策略預設為不使用字首加強功能。

同時使用 -classloaderProperties 和 -noPackagePrefixes:外掛程式 manifest 檔中的任何套件宣告都將予以忽略。 當載入類別時,將讀取類別載入器內容檔,並且將其中定義的任何宣告均列入考慮。

疑難排解

如果您取得 java.lang.ClassNotFoundException,這指出可能有一個問題與 manifest 檔或內容檔中您的項目有關。 嘗試以 -noPackagePrefixes 指令行引數執行 Eclipse, 不要使用 -classloaderProperties 引數。 這將停用所有與套件字首有關的類別載入加強功能。

這樣做之後,如果您的程式碼順利執行,表示檔案可能具有正確語法, 但以逗號區隔的清單中的套件字首可能遺漏某些項目。若要驗證這是個問題,請註銷檔案中的適當字行。 使用 # 記號來註銷內容檔中引起外掛程式發生問題的字行,或使用 HTML 註解字元 (<!-- ... -->) 來註銷引起問題的 plugin.xml 檔中的套件宣告。

已知問題

如果外掛程式 manifest 檔宣告了套件字首清單,則所有提供給它的片段也必須列出它們的套件字首。 如果未列出,它將造成 NoClassDefFoundError 問題。 解決之道為使用 -noPackagePrefixes 指令行引數來關閉類別載入器加強功能, 或將適當的套件字首項目新增至外掛程式及其所有片段。

Copyright IBM Corporation and others 2000, 2003.