Eclipse “奇异的”;NoClassDefFound“;错误

Eclipse “奇异的”;NoClassDefFound“;错误,eclipse,eclipse-plugin,Eclipse,Eclipse Plugin,这件事真让我难堪 情景: Windows 7 64位 Lotus Notes(8.5.2) 日食太阳神 Java 6使用JDK 7更新33(64位) 插件项目的已安装JRE设置为使用Notes下安装的JVM(即,C:\NotesDev\Notes\JVM) 目标平台使用上面安装的JRE,并导入位置选项卡上的framework\rcp\eclipse和framework\shared\eclipse子文件夹。我可以看到这两个文件夹之间总共有713个插件可用 运行配置显示总共选择了714个插件(包

这件事真让我难堪

情景:

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

  • 如果我没有在构建路径中明确包含上述两个JAR文件,那么应用程序将无法编译(尝试导入
    org.eclipse.swt.widgets.Display
    com.ibm.rcp.swt.swidgets.SToolItem
  • 如果我在构建路径中包含上述JAR文件,则应用程序会编译,但不会运行,因为出现了
    NoClassDefFound
    异常
  • 问题是:

  • 为什么我首先需要包含这些文件?它们是工作区的一部分,我正在引用的其他JAR文件似乎都不需要显式引用
  • 为什么在运行时会失败?我的理解是,
    NoClassDefFound
    之所以出现,是因为该类在编译时可用,但在运行时不可用。但这是在同一台机器上发生的。(我试图在本地调试它,甚至还将JAR文件标记为导出!)
  • 在我看来,如果这些文件列在运行时配置的loaded plugins选项卡中,我就不必显式引用它们。关于这一点我错了吗?(请善待我!无可否认,我不是这方面的专家。)

    提前谢谢

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

    MANIFEST.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
    
    **.类路径内容**

    <?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>
    
    
    
    当找不到Display或SToolItem引用的类时,还可以获得NoClassDefFound错误。我所知道的唯一确定找不到哪个类的方法是使用-verbose选项运行java应用程序。您得到的日志记录比您希望看到的要多得多,但是在所有这些输出行中的某个地方有一条错误消息,该消息命名了无法找到的特定类

    OSGi清单不接受系统上JAR的绝对路径(用于在捆绑包中包含JAR),如果您更新Java构建路径,则在部署时可能无法工作

    基本上,您正在编写一个OSGi包,必须小心使用类路径。看起来有两个不同的问题需要改变

  • 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捆绑包。他们需要在你的目标平台上。然后,您需要将它们添加到所需的bundle中,就像com.ibm.rcp.jfaceex一样。老实说,它们看起来像碎片。在这种情况下,应该自动拾取org.eclipse.swt.win32.win32.x86,因为您使用org.eclipse.ui,它会重新导出org.eclipse.swt。您可能需要在com.ibm.rcp.swtex上添加一个Require包(win32 swtex片段的一个可能的主机包)

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


  • 事实证明,OSGI清单将接受类路径上的绝对路径

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


    再一次,我们所考虑的事实和实际事实是两个截然不同的东西。

    在这个例子中,我确切地知道它找不到哪个类:com.ibm.rcp.swt.swidgets.SToolItem。这就是为什么如此令人困惑。我知道它在引用的JAR文件中。我知道它可以通过.CLASSPATH访问。我可以在JAR文件中看到它我真不明白为什么它找不到这个该死的类!克里斯:哦,你发现了什么。NoClassDefFound是由同一个类上的NoClassFound异常引起的。我想知道这到底是什么意思!?构建路径是什么意思?Eclipse插件编译和运行时路径通常完全由MANIFEST.MF管理。你能发布t吗对于未编译的捆绑包,是否使用MANIFEST.MF?@PaulWebster,当我通过Eclipse的UI配置生成路径时,.CLASSPATH文件和MANIFEST.MF都会被修改。我正在修改问题,以包含MANIFEST.MF文件。@PaulWebster:具体地说,我的意思是右键单击project explorer中的插件,然后选择生成路径,然后选择Con配置构建路径。虽然这并没有解决我的问题,但它确实帮助我更接近解决方案