不同Eclipse插件提供同类实现的加载顺序及自定义登录框调用疑问
Eclipse插件类加载优先级与自定义登录对话框的调用逻辑
问题
通用疑问
当两个不同的Eclipse插件(非同一插件的不同版本)提供同一Java类的不同实现时,Eclipse应用如何决定加载哪个插件中的类?是否存在插件类加载的搜索顺序?
实际场景
我们使用一款商用Eclipse应用,其自带的OOTB(开箱即用)登录对话框需要用户输入账号密码后点击OK按钮完成登录。但在我们的环境中,应用账号密码与用户OS登录账号密码一致,因此希望实现自动登录,而OOTB登录对话框无此功能。我计划反编译OOTB登录对话框代码,将其放入自定义插件的相同包下并修改为自动登录逻辑,想了解此时系统会调用哪个登录对话框?
答案
Eclipse插件类加载的核心逻辑
Eclipse基于OSGi框架实现类加载,每个插件(Bundle)都有专属的类加载器,类的加载逻辑不是简单的全局排序,核心规则如下:
- 优先加载当前插件自身的类,之后才会去加载通过
Import-Package或Require-Bundle声明依赖的插件中已导出的类 - 插件必须在
Export-Package里明确声明的包,才能被其他插件访问;没导出的包只能自己用,外界无法访问 - 如果两个插件导出了完全同名的包,谁的类被加载取决于依赖解析的顺序:如果某个插件依赖了这两个包所在的插件,会优先加载先被解析完成的那个;要是没有明确的依赖关系,类加载器只会查找自身或显式依赖的插件里的类
对你的登录对话框场景的分析
你想靠同名包类覆盖原登录框的思路基本走不通,原因很明确:
- 商用插件里的登录对话框类所在的包,几乎不可能被导出——商用软件都会把内部UI实现封装起来,不会对外暴露这类内部包,你的自定义插件根本没法导入这个包,自然不会有类加载冲突
- 就算原包真的被导出了,调用登录框的代码是原商用插件内部的逻辑,它的类加载器会优先加载自身插件里的类,根本不会去读取你自定义插件里的同名类
- 要实现自动登录,更靠谱的方式是:
- 寻找原应用提供的登录相关扩展点,通过扩展点的方式替换原登录逻辑
- 或者使用Eclipse的启动钩子(比如
org.eclipse.ui.startup扩展点),在应用启动时拦截原登录框的创建流程,替换成你的自动登录实现
内容的提问来源于stack exchange,提问作者YogiWatcher
相关产品推荐
相关产品推荐

