0

这个真的把我难住了。

设想:

  • Windows 7 64 位
  • Lotus Notes (8.5.2)
  • 日食太阳神
  • 带有 JDK 7 的 Java 6 更新 33(64 位)
  • 为插件项目安装的 JRE 设置为使用安装在 Notes 下的 JVM(即C:\NotesDev\Notes\jvm)。
  • Target Platform 使用上面安装的 JRE,并在 Locations 选项卡上导入framework\rcp\eclipse和子文件夹。framework\shared\eclipse我可以看到两个文件夹之间总共有 713 个插件可用。
  • 运行配置显示总共选择了 714 个插件(其中包括来自目标平台的 713 和我的)。我可以看到这个列表同时包含org.eclipse.swt.win32.win32.x86_3.5.2.v34557f-RCP20100710-0200.jarcom.ibm.rcp.swtex.win32_6.2.2.20100729-1241.jar

问题:

  1. 如果我没有在构建路径中明确包含上述两个 JAR 文件,应用程序将无法编译(尝试导入org.eclipse.swt.widgets.Displaycom.ibm.rcp.swt.swidgets.SToolItem)。
  2. NoClassDefFound如果我在构建路径中包含上述 JAR 文件,应用程序会编译,但由于异常而不会运行。

问题:

  1. 为什么我需要首先包含这些文件?它们是工作区的一部分,我引用的其他 JAR 文件似乎都不需要显式引用。
  2. 为什么这在运行时失败?我的理解是,NoClassDefFound发生这种情况是因为该类在编译时可用,但在运行时不可用。但这发生在同一台机器上。(我正在尝试在本地调试它,我什至已将 JAR 文件标记为导出!)

在我看来,如果文件列在运行时配置的加载插件选项卡中,我就不必明确引用它们。我对此不正确吗?(请客气!我承认我不是这方面的专家。)

提前致谢。

PS 值得注意的是,如果我将文件包含在构建路径中,我可以看到它们在MANIFEST.MF文件中都被正确引用.CLASSPATH

清单.MF 内容

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Plugin
Bundle-SymbolicName: com.satuit.crm.plugin;singleton:=true
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: com.satuit.crm.plugin.Activator
Bundle-Vendor: Satuit Technologies, Inc.
Require-Bundle: org.eclipse.ui,
 org.eclipse.core.runtime,
 org.apache.axis,
 org.eclipse.ui;bundle-version="3.4.2",
 org.eclipse.core.runtime;bundle-version="3.4.0",
 org.eclipse.ui.views;bundle-version="3.3.1",
 com.ibm.rcp.jfaceex;bundle-version="6.2.2"
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Bundle-ActivationPolicy: lazy
Export-Package: com.satuit.crm.plugin,
 com.satuit.crm.plugin.document,
 com.satuit.crm.plugin.ui,
 com.satuit.crm.webservice.agent
Bundle-ClassPath: .,
 /NotesDev/Notes/framework/rcp/eclipse/plugins/org.eclipse.swt.win32.win32.x86_3.5.2.v3557f-RCP20100710-0200.jar,
 /NotesDev/Notes/framework/rcp/eclipse/plugins/com.ibm.rcp.swtex.win32_6.2.2.20100729-1241.jar,
 /NotesDev/lib/activation-1.1.1.jar,
 /NotesDev/lib/mail.jar,
 /NotesDev/lib/commons-lang3-3.1.jar,
 /NotesDev/lib/SatuitCRM_XML_API2.jar

** .CLASSPATH 内容 **

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
    <classpathentry exported="true" kind="con" path="org.eclipse.pde.core.requiredPlugins"/>  
    <classpathentry exported="true" kind="lib" path="C:/NotesDev/Notes/framework/rcp/eclipse/plugins/org.eclipse.swt.win32.win32.x86_3.5.2.v3557f-RCP20100710-0200.jar"/>
    <classpathentry exported="true" kind="lib" path="C:/NotesDev/Notes/framework/rcp/eclipse/plugins/com.ibm.rcp.swtex.win32_6.2.2.20100729-1241.jar"/>
    <classpathentry exported="true" kind="lib" path="C:/NotesDev/Workspace/lib/commons-lang3-3.1.jar"/>
    <classpathentry exported="true" kind="lib" path="C:/NotesDev/Workspace/lib/activation-1.1.1.jar"/>
    <classpathentry exported="true" kind="lib" path="C:/NotesDev/Workspace/lib/mail.jar"/>
    <classpathentry exported="true" kind="lib" path="C:/NotesDev/Workspace/lib/SatuitCRM_XML_API2.jar"/>
    <classpathentry exported="true" kind="lib" path="C:/NotesDev/Notes/framework/rcp/eclipse/plugins/org.apache.axis_1.4.0.20100729-1241/axispatch.jar"/>
    <classpathentry exported="true" kind="lib" path="C:/NotesDev/Notes/framework/rcp/eclipse/plugins/org.apache.axis_1.4.0.20100729-1241/axis.jar"/>
    <classpathentry exported="true" kind="lib" path="C:/NotesDev/Notes/framework/rcp/eclipse/plugins/org.apache.axis_1.4.0.20100729-1241/jaxrpc.jar"/>
    <classpathentry exported="true" kind="lib" path="C:/NotesDev/Notes/framework/rcp/eclipse/plugins/org.apache.axis_1.4.0.20100729-1241/saaj.jar"/>
    <classpathentry exported="true" kind="lib" path="C:/NotesDev/Notes/framework/rcp/eclipse/plugins/org.apache.axis_1.4.0.20100729-1241/wsdl4j-1.5.1.jar"/>
    <classpathentry kind="src" path="src"/>
    <classpathentry kind="output" path="bin"/>
</classpath>
4

3 回答 3

1

当找不到 Display 或 SToolItem 引用的类时,您也可能会收到 NoClassDefFound 错误。我知道确切找出找不到哪个类的唯一方法是使用 -verbose 选项运行 java 应用程序。您获得的日志记录比您想看到的要多得多,但是在所有这些输出行中的某个地方是一条错误消息,命名了无法找到的特定类。

于 2012-06-20T19:09:33.160 回答
1

OSGi MANIFEST 不接受系统上 jar 的绝对路径(它用于将 jar 包含在包中),如果您更新 Java 构建路径,它可能在部署时不起作用。

从根本上说,您正在编写一个 OSGi 包,并且必须小心使用类路径。看起来您必须更改 2 个不同的问题。

  1. org.eclipse.swt.win32.win32.x86_3.5.2.v3557f-RCP20100710-0200.jar 和 com.ibm.rcp.swtex.win32_6.2.2.20100729-1241.jar 已经是 OSGi 包。它们需要在您的目标平台中。然后,您需要将它们添加到Required-Bundles,就像com.ibm.rcp.jfaceex 一样。老实说,它们看起来像碎片。在这种情况下,应该自动获取 org.eclipse.swt.win32.win32.x86,因为您使用了 org.eclipse.ui,它重新导出了 org.eclipse.swt。可能是您需要在 com.ibm.rcp.swtex 上添加一个 Require-Bundle(win32 swtex 片段的可能主机包)

  2. 您添加到 Bundle-ClassPath 的所有这些 jar。包中不需要的类是否已经在您的目标平台中?理想情况下,您希望从现有的 OSGi 包中使用它们。至少 org.apache.axis 已经是一个 OSGi 包。对于其余部分,如果您确实需要这些 jar 中的类,并且它们在目标平台中还没有作为导出包存在,则需要将它们转换为 OSGi 包并将它们包含在目标平台中,或者实际上将它们包含在您的 Eclipse 项目,然后从那里将它们添加到您的 Bundle-ClassPath (这将是一个项目根相对路径)。

于 2012-06-21T14:32:00.153 回答
0

好吧,事实证明,OSGI 清单接受类路径上的绝对路径。惊喜,惊喜。

是否应该是另一回事。任何人都可以猜测,一旦部署应用程序会对应用程序产生什么影响。但是运行时和编译时错误已经消失,而且到目前为止似乎还没有重新出现。

再一次,我们认为的事实和实际事实证明是两个截然不同的东西。

于 2012-07-11T19:59:27.817 回答