在EMF插件项目中使用外部库时出现NoClassDefFoundError异常

时间:2010-09-15 11:44:43

标签: java eclipse osgi eclipse-emf

我正在开发一个EMF项目,我从mdl文件创建了一个ecore模型。我创建了相应的gencore文件并从gencore文件生成代码。虽然EMF有一个基于XMI的自己的序列化机制,但我想用自己的序列化机制来支持我的项目。

到目前为止,我已经完成了必要的步骤,如果我使用调试器,则会调用相应的方法。为了读取和写入我的模型的文件表示,我想使用外部库。我已完成以下步骤

  1. 在我的插件项目中创建了一个目录lib /,我放置了外部库
  2. 将库添加到项目的构建路径
  3. 将目录添加到bundle-classpath(Manifest.mf)
  4. 将目录添加到build.properties
  5. 的bin.includes中

    如果我尝试运行我的代码,我会得到一个NoClassDefFoundError异常,我不知道为什么。我已经创建了一个运行配置,我将该项目作为eclipse应用程序启动。所以有人知道我错过了什么?

    提前致谢!
      迈克尔

    编辑:在我的Manifest.mf文件下面

    Manifest-Version: 1.0  
    Bundle-ManifestVersion: 2  
    Bundle-Name: de.hs_rm.cs.vs.dsm.OWL  
    Bundle-SymbolicName: de.hs_rm.cs.vs.dsm.owl;singleton:=true
    Bundle-Version: 1.0.0  
    Bundle-ClassPath: lib/,
     .
    Bundle-Localization: plugin  
    Bundle-RequiredExecutionEnvironment: JavaSE-1.6  
    Export-Package: owl,  
     owl.impl,  
     owl.util,  
     rdfs,  
     rdfs.impl,  
     rdfs.util  
    Require-Bundle: org.eclipse.core.runtime,  
     org.eclipse.emf.ecore;visibility:=reexport  
    Bundle-ActivationPolicy: lazy  
    

    以及我的build.properties

    bin.includes = .,\
                   model/,\
                   META-INF/,\
                   plugin.xml,\
                   plugin.properties,\
                   lib/
    jars.compile.order = lib/,\
                         .
    source.. = src/
    output.. = bin/
    source.lib/ = lib/
    jars.extra.classpath = lib/owlapi-bin.jar
    

3 个答案:

答案 0 :(得分:1)

这不是百分之百的解决方案,因为我根本不知道究竟是什么问题。我找到了一个链接,其中有人有完全相同的问题(在执行期间添加了一个jar作为库,NoClassDefFoundError异常)。到目前为止,必要的步骤是:

  1. 使用“导入 - >文件系统”
  2. 导入JAR
  3. 将JAR文件添加到Manifest / plugin.xml运行时选项卡的classpath部分
  4. 按“新建...”添加“。”库返回类路径
  5. 检查二进制构建是否在“构建”选项卡上导出新的JAR文件
  6. 按保存
  7. 在项目浏览器视图中选择同步项目,右键单击并选择“PDE工具 - >更新类路径”。这会将新添加的JAR文件添加到项目的类路径中。
  8. 自从我将库自己添加到项目的构建路径以来,我在最后一步遇到了一些麻烦。每次我执行此操作时,eclipse都会在执行“Update classpath命令”时从构建路径中删除库。我已经重复了第六步而没有将库添加到构建路径中,而且它现在正在工作。

    对我来说似乎有点奇怪,但它现在正在发挥作用。无论如何,我想感谢你的帮助!

    此致  迈克尔

答案 1 :(得分:0)

如果您正在编写Eclipse插件而不是普通的旧Java项目,则必须在Manifest.mf编辑器的Runtime选项卡的classpath字段中添加库。

答案 2 :(得分:0)

在尝试访问lib或尝试访问Ecore模型时,是否获得NoClassDefFoundError?如果是后一种情况,请检查您的emf包是否已在plugin.xml文件中注册。寻找以下部分:

<extension point="org.eclipse.emf.ecore.generated_package">
  <package
       uri="«package URI here»"
       class="«package class name here»"
       genModel="«genmodel location here»"/>
</extension>

如果在使用genmodel生成之前生成了plugin.xml,则可能会丢失此部分,因为在代码生成过程中,清单和plugin.xml都不会更新。

另一方面,如果库访问会抛出异常,那么我会尝试删除并重新添加依赖项,或者清理构建项目,但这些似乎不太可能解决异常。