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
子文件夹。我可以看到这两个文件夹之间总共有713个插件可用framework\shared\eclipse
- 运行配置显示总共选择了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
org.eclipse.swt.widgets.Display
和com.ibm.rcp.swt.swidgets.SToolItem
)NoClassDefFound
异常NoClassDefFound
之所以出现,是因为该类在编译时可用,但在运行时不可用。但这是在同一台机器上发生的。(我试图在本地调试它,甚至还将JAR文件标记为导出!)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包,必须小心使用类路径。看起来有两个不同的问题需要改变
事实证明,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配置构建路径。虽然这并没有解决我的问题,但它确实帮助我更接近解决方案