这个问题是对this one的跟进。 Paul Webster慷慨地帮助我找出了我的许多问题,但仍有一个棘手的问题,而且我很确定当我导出插件时,它会归结为类路径问题,而不是当我调试插件时。
这是我到目前为止所发现的可疑信息,通过从Web上的各种来源中搜集信息(this page是一个非常宝贵的资源):
Bundle-Classpath
。如果在JRE系统库,插件依赖项或Bundle-Classpath
中的文件夹或JAR中找不到该类,则会发生NoClassDefFound
或NoClassFound
异常。 Require-Bundle
。 (换句话说,在我的工作区中捆绑。这意味着,我的Require-Bundle
列表将很短。)Import-Package
用于我的捆绑包所需的第三方软件包。此列表可能相当大,具体取决于我正在使用的第三方软件包。(我会在社区更正时更新上述信息。)
因此,考虑到所有这些,我已经重新设计了我的MANIFEST.MF文件,以便遵守上述规则。调试应用程序时,一切都很好用。找到所有类,插件按预期运行,但是当我去导出插件时,事情变得很难看。
当我尝试导出插件时,所有项目都会编译,除了一个。日志文件包含以下消息:
# 7/3/12 10:09:57 AM EDT
# Eclipse Compiler for Java(TM) 0.A76_R36x, 3.6.2, Copyright IBM Corp 2000, 2010. All rights reserved.
----------
1. ERROR in E:\NotesDev\NotesPlugin\com.auth.lotusplugin.popdlg\src\com\auth\lotusplugin\popdlg\SettingsDialog2.java (at line 0)
package com.auth.lotusplugin.popdlg;
^
The type com.ibm.rcp.swt.swidgets.SCoolBar cannot be resolved. It is indirectly referenced from required .class files
----------
1 problem (1 error)
现在,我已确定com.ibm.rcp.swt.swidgets.SCoolBar
导出com.ibm.rcp.swtex.win32_6.2.2.20100729-1241.jar
,com.ibm.rcp.jfaceex_6.2.2.20100729-1241.jar
也正在导出com.ibm.rcp.jfaceex
。在我的项目中,我做了以下事情:
build.properties
添加了com.ibm.rc.swt.swidgets
作为附加包。MANIFEST.MF
作为导入的包。但是,当我尝试导出插件时,无法找到该类。在这一点上,我假设插件在调试时的编译方式与导出插件的方式之间存在一些根本区别,而且我不知道这是什么区别。
如果有人可以帮我解决最后一期,我真的很感激。
build.properties
和Require-Bundle: com.ibm.lotuslabs.context.service,
com.ibm.lotuslabs.ui,
com.SatuitCRM.WebServices
Import-Package: com.ibm.rcp.jface.action,
com.ibm.rcp.swt.swidgets,
javax.swing,
lotus.domino,
lotus.notes,
org.eclipse.jface.action,
org.eclipse.jface.window,
org.eclipse.swt,
org.eclipse.swt.events,
org.eclipse.swt.graphics,
org.eclipse.swt.layout,
org.eclipse.swt.widgets,
org.eclipse.ui.plugin,
org.osgi.framework
Export-Package: com.auth.lotusplugin.popdlg;
uses:="com.ibm.rcp.jface.action,
com.ibm.lotuslabs.context.service.document,
com.ibm.lotuslabs.ui,
com.ibm.rcp.jface.action,
com.ibm.rcp.swt.swidgets,
com.satuit.core,
com.SatuitCRM.WebServices,
javax.swing,
lotus.domino,
lotus.notes,
org.eclipse.jface.action,
org.eclipse.jface.window,
org.eclipse.swt,
org.eclipse.swt.events,
org.eclipse.swt.graphics,
org.eclipse.swt.layout,
org.eclipse.swt.widgets,
org.eclipse.ui.plugin,
org.osgi.framework"
Bundle-ClassPath: .,
com.satuit.core.jar,
com.ibm.lotuslabs.ui.jar,
com.ibm.lotuslabs.context.service.jar,
com.SatuitCRM.WebService.jar,
lib/activation-1.1.1.jar,
lib/commons-lang3-3.1.jar,
lib/mail.jar,
lib/SatuitCRM_XML_API2.jar
文件的相关部分包含在下面以供参考。
MANIFEST.MF
source.. = src/
output.. = bin/
bin.includes = META-INF/,\
plugin.xml,\
lib/commons-lang3-3.1.jar,\
lib/activation-1.1.1.jar,\
lib/mail.jar,\
lib/SatuitCRM_XML_API2.jar,\
.
additional.bundles = com.ibm.rcp.browser.ie,\
com.ibm.rcp.jfaceex
build.properties
{{1}}
答案 0 :(得分:1)
没有明确的答案,但也许这些帮助:
我认为您只需要正确设置目标平台。确保目标平台包含所需的所有不在工作区中的软件包。指定依赖关系时,无论捆绑包是在工作区中还是在目标平台中,都可以使用Require-Bundle(或者更好的是Import-Package)。
其余的:
从你的软件包中导出系统软件包(比如javax.swing)通常是一个坏主意,因为它可能会在以后搞乱解决方案。你真的应该只从该捆绑包中的捆绑包中导出东西
我对'additional.bundles'结构并不太熟悉,它不是标准的OSGi,我认为你不需要它。