【问题标题】:Eclipse Extensions and Declarative ServicesEclipse 扩展和声明式服务
【发布时间】:2010-10-15 21:13:21
【问题描述】:

我对 Eclipse 架构中的扩展/服务方法有点困惑。 开发人员有两种选择:

  1. Eclipse插件扩展的使用-http://www.eclipse.org/articles/Article-Plug-in-architecture/plugin_architecture.html
  2. 声明式服务的使用 - http://www.eclipse.org/equinox/bundles/

什么时候你会使用其中一种,有什么优点和缺点 每种方法?未来哪个是首选方法?

【问题讨论】:

    标签: java eclipse plugins eclipse-plugin osgi


    【解决方案1】:

    在 EclipseZone 上有一个很好的比较(我认为是从 2007 年开始):A Comparison of Eclipse Extensions and OSGi Services

    我会遵循您的目标平台的约定。因此,如果您正在为 Eclipse 3.4 编写插件,比如说,创建一个 Eclipse 3.4 插件(它将使用 MANIFEST.MF 来表示依赖项,使用 plugin.xml 表示扩展/扩展点 - 您链接到的文章是针对 Eclipse 2.x 的)。您可以检查 plugins 目录的内容来确认这一点。

    【讨论】:

    • 这是一篇关于这两种方法的有趣文章,各有优缺点。
    【解决方案2】:

    “当前”方法(pre3.5M5,如 eclipse3.4)的问题在于 Eclipse 插件扩展或 OSGI DS(声明式服务)确实需要一些特定于扩展或 OSGI 的 API 存在你的插件。

    我建议您在此 Powerpoint 演示文稿中查看对声明式服务的精彩介绍:
    Component Oriented Development in OSGi with Declarative Services, Spring Dynamic Modules and Apache iPOJO,来自 EclipseCON2009。

    这是一个味道:


    模块层允许最小化静态依赖项,更少的静态依赖项意味着更少的stuff,您的组件才能正常工作。
    服务允许您的组件与其他组件交互。

    组件应以 POJO(普通旧 Java 对象)粘合与 OSGi 服务一起实现。

    声明式服务 (DS) 是来自 OSGi 纲要第 112 节的规范。
    它是在 4.0 版中引入的,基于扩展器模型。

    与所有扩展程序一样,DS代表其他捆绑包执行任务。 DS 规范定义了这个扩展器,它由框架实现。
    扩展包本身称为 Service Component Runtime 或 SCR。

    术语 DS 和 SCR 有时会混淆:
    DS 是规范,SCR 是实现规范的实际捆绑包

    在 OSGi R4.2 中对 DS 进行了重大改进。
    Equinox 3.5M5+ 支持其中许多更改。

    SCR(“服务组件运行时”是一个“扩展包”,实现了新的和改进的 OSGi R4.2 DS - 声明式服务 - 规范)将:

    • 创建组件。
    • 它们绑定到服务和配置
    • 管理组件的生命周期以响应绑定服务的进出。
    • (可选)将组件作为服务本身发布

    你还有一个 MANIFEST.MF:

    Bundle-SymbolicName : mybundle
    Bundle-Version : 1.0.0
    Service-Component : OSGI-INF/minimal. xml
    

    您将使用:

    org.eclipse.equinox.ds <version>.jar
    org.eclipse.equinox.util <version>.jar
    

    SCR 会自动找到激活/停用方法。
    我们可以通过在 XML 声明中添加属性来调用它们

    在 R4.2 之前,方法名称无法更改,它们必须从 DS API 获取 ComponentContext 类型的参数。这破坏了组件的优势。

    因此,您无需编写“BundleActivator”(组件中的 OSGI 特定 API:BAD),而是编写一个普通的 POJO 对象:

    public class PollingComponent {
        private static final int DEFAULT_PERIOD = 2000;
        private PollingThread thread ;
        protected void activate ( Map<String , Object> config ) {
            System.out.println( " Polling Component Activated " );
            Integer period = (Integer)config.get( " period " );
            thread = new PollingThread(
                period!=null ? period : DEFAULT_PERIOD);
            thread.start();
        }
        protected void deactivate() {
            System.out.println( " Polling Component Deactivated " );
            thread.interrupt();
        }
    }
    

    您将简单地声明您对其他服务的引用:

    <reference name="LOG"
        interface="org.osgi.service.log.LogService "
        bind="setLog" unbind="unsetLog"
        cardinality="0..1"/>
    

    您可以将组件作为服务本身发布:
    这是通过 XML 描述符中的 &lt;service&gt; 元素完成的。

    <service>
        <provide interface="net ... ContactRepository"/>
        <property name="foo" value="bar"
    </service>
    

    只需添加额外的&lt;provide&gt; 元素即可提供多种服务。
    使用&lt;property&gt; 元素指定服务属性。这些属性在激活时传递给组件并发布到服务注册表

    【讨论】:

    • 谢谢。我了解如何使用 DS 创建服务,但我一直在寻找每个优点/缺点以及 Eclipse 愿景和首选方法(如果有的话)向前发展的任何提示。
    • @Jon:我明白了。我只是想指出你会在这两种方法中发现的一个缺点(显式依赖),除非你使用最新的 DS 规范。
    猜你喜欢
    • 1970-01-01
    • 2021-06-13
    • 2012-06-13
    • 1970-01-01
    • 2012-04-27
    • 2019-11-26
    • 2012-11-06
    • 1970-01-01
    • 2021-01-05
    相关资源
    最近更新 更多