4

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

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

什么时候你会使用一种方法,每种方法的优点和缺点是什么?还要继续前进,哪种方法是首选方法?

4

2 回答 2

4

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

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

于 2009-03-27T11:46:30.800 回答
2

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

我鼓励您在这个 Powerpoint 演示文稿中查看对声明式服务的精彩介绍:来自 EclipseCON2009
的使用声明式服务、Spring 动态模块和 Apache iPOJO 的 OSGi 中的面向组件的开发。

这是一个味道:


模块层允许最小化静态依赖,更少的静态依赖意味着更少的东西必须存在才能让你的组件工作。
服务允许您的组件与其他组件交互。

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

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

与所有扩展程序一样,DS代表其他捆绑包执行任务。DS 规范定义了这个扩展器,它由框架实现。
扩展程序包本身称为服务组件运行时或 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 之前,方法名称无法更改,它们必须ComponentContext从 DS API 获取类型参数。这打破了组件的优势。

因此,您无需编写“ 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"/>

您可以将组件作为服务本身发布:
这是通过<service>我们的 XML 描述符中的元素完成的。

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

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

于 2009-03-27T12:43:34.813 回答