0

这个问题是这个问题的后续问题Paul Webster慷慨地帮助我解决了许多问题,但仍然存在一个烦人的问题,而且我相当确定在我导出插件时它归结为类路径问题,而不是在我调试插件时.

到目前为止,这是我通过从网络上的各种来源收集信息(此页面是非常宝贵的资源)得出的可疑信息:

  • 插件完全依赖Bundle-Classpath于 MANIFEST.MF 文件中的。如果在 JRE 系统库、插件依赖项或文件夹或 JAR 中的任何一个中都找不到该类,则会发生Bundle-Classpatha NoClassDefFoundorNoClassFound异常。
  • 仅用于Require-Bundle我正在创建的捆绑包。(换句话说,我的工作区中的捆绑包。这意味着,我的Require-Bundle列表将非常短。)
  • 用于Import-Package我的捆绑包需要的 3rd-party 包。这个列表可能相当大,这取决于我使用了多少个 3rd-party 包。
  • 如果我需要一个 3rd-party 包,但它没有被导出,我需要为它创建一个包并导出该包。然后,在需要它的包中,我需要导入导出包。
  • 如果一个包本身包含包内的包并导出它们,切勿将这些包也作为导入包放入清单中。(换句话说,不要重新导出已经被捆绑包导出的包。)

(我会在社区更正时更新上面的信息。)

因此,考虑到所有这些,我重新设计了我的 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。在我的项目中,我做了以下事情:

  1. 通过 Dependencies 选项卡com.ibm.rcp.jfaceex作为附加包添加。build.properties
  2. 在 Dependencies 选项卡上添加com.ibm.rc.swt.swidgets为导入包。

尽管如此,当我尝试导出插件时找不到该类。在这一点上,我假设插件在调试时的编译方式与导出时的编译方式之间存在一些根本差异,并且我不知道这种差异是什么。

如果有人可以帮助我解决最后一个问题,我将不胜感激。

以下包括相关部分MANIFEST.MFbuild.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

build.properties

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
4

1 回答 1

1

没有明确的答案,但也许这些有帮助:

认为您只需要正确设置目标平台即可。确保您的目标平台包含您需要但不在您的工作区中的所有捆绑包。指定依赖项时,您可以使用 Require-Bundle(或者更好的是 Import-Package),无论该包是在您的工作区还是在您的目标平台中。

对于其余的:

  • 从你的包中导出系统包(如 javax.swing)通常是一个坏主意,因为它可能会在以后搞砸分辨率。你真的应该只从那个包中的包中导出东西

  • 我对“additional.bundles”结构不太熟悉,它不是标准的 OSGi,我认为你不需要它。

于 2012-07-03T22:28:48.293 回答