Eclipse 我是否误解了OSGI捆绑包中导出包的用法?

Eclipse 我是否误解了OSGI捆绑包中导出包的用法?,eclipse,eclipse-plugin,osgi,eclipse-3.6,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

我正在开发一个插件,它需要访问类
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系统库中。然而,它是一个包,包括它自己的类以及上面导出的包

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

如果我需要这些类,我需要做什么才能正确地导入它们,并且工作量最少

注意我们没有使用Maven或任何第三方构建工具。这是管理层授权的,我不能改变

更新

根据下面E-Riz的建议,我将
org.eclipse.swt
添加到插件的Dependencies选项卡的RequiredBundles部分。然后,我尝试导出项目,如下所示:

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
  • 右键单击“项目”,选择“导出”
  • 选择插件开发->可部署插件和片段
  • 选择全部,然后单击完成
  • 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

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

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

    Notes报告该插件已成功安装,但该插件(工具栏上的一个添加项)未显示。在这一点上,我假设类路径仍然不正确

    更新3

    每个请求都包含
    MANIFEST.MF
    build.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
    
    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/
    
    build.properties

    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
    
    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/
    

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


    对您来说,解决方案很简单:在
    MANIFEST.MF
    中,转到dependencies选项卡,将
    org.eclipse.swt
    添加到所需插件列表中

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


    对您来说,解决方案很简单:在
    MANIFEST.MF
    中,转到Dependencies选项卡,将
    org.eclipse.swt
    添加到所需插件列表中

    不太确定,但有两件事需要考虑

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

    • 或者保留引用并将jar添加到包类路径(在清单的运行时选项卡上)


    不太清楚这将如何导致这个错误,但是类路径问题可以在PDE中以奇怪的方式表现出来。

    不太确定,但我想到了两件事

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

    • 或者保留引用并将jar添加到包类路径(在清单的运行时选项卡上)


    不太清楚这将如何导致此错误,但类路径问题可能会在PDE中以奇怪的方式表现出来。

    我已经查看了eclipse juno中与swt相关的捆绑包: org.eclipse.swt_3.100.0.v4233d.jar org.eclipse.swt.win32.win32.x86_3.100.0.v4233d.jar

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

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

    我已经查看了EclipseJuno中与swt相关的包: org.eclipse.swt_3.100.0.v4233d.jar org.eclipse.swt.win32.win32.x86_3.100.0.v4233d.jar

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

    因此,您必须确保两个捆绑包都位于目标平台中。我不确定requirebundle在这种情况下是否有效(可能有效)。您可以尝试导入所需的所有包。
    尤其需要在org.eclipse.swt.widgets包上导入包。

    我试过了。不幸的是,当我尝试将捆绑导出到时,这会产生错误