使用类装入器增强功能

上次更新时间:2002 年 12 月 9 日

Eclipse 2.1 包括许多性能增强功能(包括类装入区域的一些功能)。为了帮助进行此项工作,已将标记添加至插件清单文件,此文件会说明标记的使用。

激活

缺省情况下,自动启用类装入器性能增强功能。如果用户希望覆盖此行为并禁用这些功能,这些功能可将 -noPackagePrefixes 命令行自变量传递给 Eclipse 可执行文件。

格式化

插件清单文件中的包前缀声明由在该文件中声明的每个库的 packages 元素指示。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 元素包括在插件清单中,则您的代码仍会起作用,但没有充分利用到类装入优化的优点。注意,包前缀的列表对于插件中所有库的所有包必须是完整的。如果此列表不完整,则您的代码将不起作用。

与类装入器属性文件配合使用

在 Eclipse 2.0.2 和早期的 Eclipse 2.1 Integration 构建中,添加了一个允许用户指定类装入器属性文件(它包含了启用类装入器增强功能的包前缀)的功能部件。此文件的使用是在此处指定的。

Eclipse 2.1 与类装入器属性文件完全向下兼容,因而,实际上,可以将它与插件清单中的包前缀声明结合使用。本节描述这两种机制之间的交互行为。

缺省行为:(无命令行自变量)将从 plugin.xml 文件读取包前缀并将它们应用于类装入策略。不访问或考虑 classloader.properties 文件。

使用 -classloaderProperties:先从 plugin.xml 文件读取包前缀,然后读取 classloader.properties 文件。如果类装入器属性文件中存在一个条目对应于在清单文件中定义了前缀的插件,则属性文件中的条目将重设并优先于其它条目。(结果未合并)如果属性文件中的条目不包含值(例如,org.eclipse.core.runtime=),则将除去在清单文件中声明的任何前缀,且类装入策略将缺省为不使用增强功能。

使用 -noPackagePrefixes:忽略在插件清单文件中声明的任何包前缀,也不考虑类装入器属性文件。类装入策略缺省为不使用前缀增强功能。

使用 -classloaderProperties 和 -noPackagePrefixes:忽略插件清单文件中的任何包声明。在类装入时读取类装入器属性文件并考虑在该文件内定义的任何声明。

故障诊断

如果获取了 java.lang.ClassNotFoundException,则这指示清单或属性文件中的条目可能有问题。尝试使用 -noPackagePrefixes 命令行自变量运行 Eclipse,而不要使用 -classloaderProperties 自变量。这将禁用与包前缀有关的所有类装入增强功能。

如果在完成此操作之后您的代码运行情况良好,则表示文件语法是正确的,但是以逗号分隔的列表中的包前缀可能丢失了某些条目。要验证发生的是否就是这个问题,注释掉文件中的适当行。使用数字符号(#)来注释掉属性文件中错误的插件的行,或使用 HTML 注释字符(<!-- ... -->)来注释掉错误的 plugin.xml 文件中的包声明。

已知问题

如果插件清单文件声明包前缀的列表,则添加至该文件的所有段也必须列示它们的包前缀。如果不列示,则会导致 NoClassDefFoundError 问题。可以通过使用 -noPackagePrefixes 命令行自变量关闭类装入器增强功能或通过将适当的包前缀条目添加至插件及其所有段来解决此问题。

Copyright IBM Corporation and others 2000, 2003.