我是否误解了OSGI Bundles中Export-Package的用法?

时间:2012-07-06 16:00:59

标签: eclipse eclipse-plugin osgi eclipse-3.6

我正在开发一个需要访问类org.eclipse.swt.widgets.Display的插件。该课程包含在org.eclipse.swt.win32.win32.x86_3.5.2.v3557f-RCP20100710-0200.jar中。但是,该类也由com.ibm.rcp.jfaceex_6.2.2.20100729-1241中的清单导出,如下所示:

Export-Package: com.ibm.rcp.jface.action,com.ibm.rcp.jface.launcher,co
 m.ibm.rcp.jface.themes,com.ibm.rcp.jface.util,com.ibm.rcp.jface.viewe
 rs,com.ibm.rcp.jface.window,com.ibm.rcp.jface.window.effects,com.ibm.
 rcp.ui.widgets.api.jface,com.ibm.rcp.ui.widgets.api.swt
Require-Bundle: com.ibm.rcp.swtex,org.eclipse.swt,org.eclipse.core.run
 time,org.eclipse.jface,org.eclipse.ui

现在,com.ibm.rcp.jfaceex 作为我的JRE系统库的一部分。但是,它是一个捆绑包,它包含自己的类,以及上面导出的包。

我被告知,我在自己的项目中需要做的就是在我自己的项目的构建路径中包含对它的引用,但这似乎不起作用。编译器无法针对org.eclipse.swt.widgets包中的类解析import语句。

如果我需要这些课程,我需要做什么才能正确导入 ,并且工作量最少?

注意我们不使用Maven或任何第三方构建工具。这是管理层要求的,我无法改变它。

更新

根据以下E-Riz的建议,我将org.eclipse.swt添加到插件的Dependencies选项卡的Required Bundles部分。然后,我尝试按如下方式导出项目:

  1. 右键单击项目,选择“导出”。
  2. 选择插件开发 - >可部署的插件和片段
  3. 选择全部,然后单击完成
  4. Eclipse构建项目,然后告诉我有错误。检查日志会显示以下错误:

    1. ERROR in E:\NotesDev\Plug-in\com.ibm.lotuslabs.ui\src\com\ibm\lotuslabs\ui\UI.java (at line 1)
        /**
        ^
    The type org.eclipse.swt.widgets.Shell cannot be resolved. It is indirectly referenced from required .class files
    

    在我的代码中有很多这些;一个用于org.eclipse.swt命名空间包中的类或方法的每个引用。尽管捆绑调试很好!

    更新2

    我发现你可以实际上将绝对路径放入Bundle-Classpath中的MANIFEST.MF。奇怪的是,这使编译时错误消失了。我不相信这是正确的做法,因为绝对路径肯定不能保证与最终用户的配置相对应。

    但是,将插件安装到Notes(目标平台)中并不能按预期工作。

    Notes报告插件已成功安装,但插件(工具栏的附加内容)未显示。在这一点上,我假设类路径的东西仍然不对。

    更新3

    每个请求,MANIFEST.MFbuild.properties个文件。请注意,Eclipse通过Dependencies和Runtime选项卡添加了绝对路径。

    MANIFEST.MF

    Manifest-Version: 1.0
    Bundle-ManifestVersion: 2
    Bundle-Name: Context Plug-in
    Bundle-SymbolicName: com.ibm.lotuslabs.context.service;singleton:=true
    Bundle-Version: 1.0.2
    Bundle-Vendor: IBM
    Bundle-RequiredExecutionEnvironment: JavaSE-1.6
    Bundle-Activator: com.ibm.lotuslabs.context.service.internal.ContextPlugin
    Bundle-ActivationPolicy: lazy
    Bundle-ClassPath: context.jar,
     lib/activation-1.1.1.jar,
     lib/mail.jar,
     lib/SatuitCRM_XML_API2.jar,
     lib/commons-lang3-3.1/commons-lang3-3.1.jar,
     E:/NotesDev/Notes/framework/rcp/eclipse/plugins/org.eclipse.swt.win32.win32.x86_3.5.2.v3557f-RCP20100710-0200.jar
    Require-Bundle: org.eclipse.core.runtime,
     org.eclipse.ui,
     org.eclipse.ui.views,
     org.eclipse.swt,
     com.ibm.rcp.swtex,
     com.ibm.rcp.jfaceex,
     com.satuit.core 
    Export-Package: com.ibm.lotuslabs.context.service.document,
     com.ibm.lotuslabs.context.service.internal
    Import-Package: org.eclipse.core.resources
    

    build.properties

    output.. = bin/
    bin.includes = META-INF/,\
                   context.jar,\
                   lib/activation-1.1.1.jar,\
                   lib/mail.jar,\
                   lib/commons-lang3-3.1.jar,\
                   lib/SatuitCRM_XML_API2.jar,\
                   plugin.xml,\
                   E:/NotesDev/Notes/framework/rcp/eclipse/plugins/org.eclipse.swt.win32.win32.x86_3.5.2.v3557f-RCP20100710-0200.jar
    jars.compile.order = context.jar
    source.context.jar = src/
    

3 个答案:

答案 0 :(得分:3)

仅仅因为bundle在其Export-Package声明中命名一个包并不一定意味着包含该包的代码。捆绑包可以从它依赖的捆绑包中导出包(虽然我认为在大多数情况下这通常是一个坏主意)。

对于您而言,解决方案很简单:在MANIFEST.MF中转到“依赖项”标签,然后将org.eclipse.swt添加到必需的插件列表

答案 1 :(得分:2)

不太确定,但有两件事情会浮现在脑海中。

  • 从项目类路径中删除jar并将com.ibm.rcp.jfaceex jar添加到目标平台(Preferences-> PDE-> Target platform并指向包含com.ibm的目录.rcp.jfaceex jar)

  • 或保留引用并将jar添加到bundle类路径中(在MANIFEST的运行时选项卡上)

它不太明白这会导致错误,但类路径问题可能会在PDE中以奇怪的方式表现出来。

答案 2 :(得分:0)

我看过eclipse juno中的swt相关包: org.eclipse.swt_3.100.0.v4233d.jar org.eclipse.swt.win32.win32.x86_3.100.0.v4233d.jar

小部件位于第二个包中,它是第一个包的片段。

因此,您必须确保两个捆绑包都在目标平台中。我不确定在这种情况下是否需要捆绑工作(它可能有效)。您可以尝试导入所需的所有包。 特别是你需要在包org.eclipse.swt.widgets上使用Import-Package。