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
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包上导入包。我试过了。不幸的是,当我尝试将捆绑导出到时,这会产生错误