java - 启用 OSGi/RCP 插件从另一个非依赖插件加载类

标签 java osgi eclipse-rcp classloader gridgain

我有一组三个 RCP 插件:一个是我的主应用程序插件,另一个是计算集合,第三个是 GridGain 的包装器,其中必须根据计算创建类的实例插件。

主插件使用 ExtensionPoint 实例化来实例化计算和 GridGain 插件中的类,例如:

    IExtensionRegistry registry = Platform.getExtensionRegistry();

    IExtensionPoint providerExtensionPoint = registry.getExtensionPoint(EXT_CORE_DATA_PROVIDERS);
    IConfigurationElement[] providers = providerExtensionPoint.getConfigurationElements();

    List<DataProviderFactory> dataProviders = new ArrayList<DataProviderFactory>();
    for (IConfigurationElement member : providers) {
        try {
            Object obj = member.createExecutableExtension(K_CLASS);
            if (obj instanceof DataProviderFactoryFactory) {
                DataProviderFactoryFactory factory = (DataProviderFactoryFactory) obj;
                for (Object o : factory.createProviderFactories(this, holdingProperties())) {
                    dataProviders.add((DataProviderFactory) o);
                }
            }
        }
        catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    return dataProviders;

因此对其他插件没有直接依赖。

当 GridGain 必须从计算插件实例化类的实例时,我的问题就出现了。由于 GridGain 插件没有直接依赖于计算插件,因此它的类加载过程看不到那里的类,因此我得到了 ClassNotFoundException。

我过去使用 RCP buddy policies 解决了类似的问题,这似乎与您在 ORM 中遇到的问题类似。然而,“注册”策略取决于这样一个事实:定义类的插件(在我的例子中是计算插件)依赖于实例化它们的插件(GridGain 插件)。在我的场景中,不存在这种依赖性。因此,将 BuddyPolicy: 注册到 GridGain 和 RegisterBuddy: gridgain 添加到计算插件不起作用。

我发现使 GridGain 插件从计算插件解析类的唯一方法是显式定义 GridGain 为计算依赖项。在我看来,这不是必需的,应该有一种方法可以使其成为软依赖项,如果存在计算插件,GridGain 可以从中实例化类。是否有另一种方法来模拟这种相互依赖关系,以便我的类加载问题消失?

最佳答案

GridGain 插件应该以某种方式依赖于您的计算插件。如果您没有定义任何依赖项,GridGain 将无法访问计算类。我可以想到这一点,创建另一个具有通用接口(interface)的插件(基础插件),并使GridGain和计算依赖于基础插件。在计算插件中为您在基本插件中定义的接口(interface)公开声明性服务。

在GridGain插件中,使用osgi ServiceTracker来等待计算插件中公开的服务。

关于java - 启用 OSGi/RCP 插件从另一个非依赖插件加载类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12958655/

相关文章:

java - 用于组合多个序列的正则表达式

java - 在 OSGi 引用注释中动态设置目标属性

dialog - 如何确定 JFace 或 SWT 对话框当前处于打开状态?

java - 检查大型机 FTP 服务器上的路径是文件还是文件夹。

Java UTF-8 编码产生不正确的输出

java - 浏览器支持 Java Applet 的线程吗?

java - 使用 Logback 进行 Apache Felix OSGi 日志记录

maven - 为 Liferay 手动创建可部署的 JAR

java - 是否可以在 Eclipse 中跟踪资源只读属性?

java - 如何获取所有源代码文件并检查是否已以编程方式在Eclipse中对其进行了修改