Eclipse插件:调试与导出类路径

时间:2012-07-03 16:00:18

标签: eclipse eclipse-plugin osgi

这个问题是对this one的跟进。 Paul Webster慷慨地帮助我找出了我的许多问题,但仍有一个棘手的问题,而且我很确定当我导出插件时,它会归结为类路径问题,而不是当我调试插件时。

这是我到目前为止所发现的可疑信息,通过从Web上的各种来源中搜集信息(this page是一个非常宝贵的资源):

  • 插件完全依赖于MANIFEST.MF文件中的 Bundle-Classpath 。如果在JRE系统库,插件依赖项或Bundle-Classpath中的文件夹或JAR中找不到该类,则会发生NoClassDefFoundNoClassFound异常。
  • 仅对我正在创建的捆绑包使用 Require-Bundle 。 (换句话说,在我的工作区中捆绑。这意味着,我的Require-Bundle列表将很短。)
  • Import-Package 用于我的捆绑包所需的第三方软件包。此列表可能相当大,具体取决于我正在使用的第三方软件包。
  • 如果我需要第三方软件包,并且未导出,我需要为其创建一个软件包并导出该软件包。然后,在需要它的包中,我需要导入导出包。
  • 如果bundle本身包含bundle中的包并导出它们,那么永远不要将这些包作为导入的包放入Manifest中。 (换句话说,不要重新导出已经由捆绑导出的包。)

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

因此,考虑到所有这些,我已经重新设计了我的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.jarcom.ibm.rcp.jfaceex_6.2.2.20100729-1241.jar也正在导出com.ibm.rcp.jfaceex。在我的项目中,我做了以下事情:

  1. 通过“依赖关系”标签向build.properties添加了com.ibm.rc.swt.swidgets作为附加包。
  2. 在“依赖关系”选项卡上添加了MANIFEST.MF作为导入的包。
  3. 但是,当我尝试导出插件时,无法找到该类。在这一点上,我假设插件在调试时的编译方式与导出插件的方式之间存在一些根本区别,而且我不知道这是什么区别。

    如果有人可以帮我解决最后一期,我真的很感激。

    build.propertiesRequire-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}}

1 个答案:

答案 0 :(得分:1)

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

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

其余的:

  • 从你的软件包中导出系统软件包(比如javax.swing)通常是一个坏主意,因为它可能会在以后搞乱解决方案。你真的应该只从该捆绑包中的捆绑包中导出东西

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