【问题标题】:java.lang.NoClassDefFoundError on OSGiOSGi 上的 java.lang.NoClassDefFoundError
【发布时间】:2011-07-08 01:29:44
【问题描述】:

我有一个捆绑包,声明了一个激活器。这个激活器创建一个 JFrame 并显示它。

在 Eclipse 上作为插件项目运行它工作正常。当我穿上菲利克斯时,它不再起作用了。 表明: java.lang.NoClassDefFoundError: com/griep/ui/MainFrame

但是 MainFrame 与激活器位于同一个包中,当然,作为一个公共类。我不明白为什么类加载器找不到类。

有人知道发生了什么吗?

【问题讨论】:

  • 是否有包装异常?

标签: java eclipse osgi apache-felix helios


【解决方案1】:

确保将javax.swing 包导入到您的捆绑包中:

Import-Package: javax.swing

【讨论】:

  • @Neil 不,这是错误的,OPhas 是 osgi 配置文件设置为 Bundle-RequiredExecutionEnvironment: J2SE-1.5,这意味着 javax.* 包应该由 system.bundle 自动导出
  • @Suraj 很抱歉不得不公开不同意,但仅仅因为 javax.swing 包是由系统包导出的,并不意味着它会被所有其他包自动导入。 OSGi 中的规则是您必须导入您使用的包,唯一的例外是“java.*”。
  • @Neil @Neil 你在写这样的东西之前有没有试过。我可以使用 javax.swing 包而不导入它。你知道“Bundle-RequiredExecutionEnvironment”的概念和profiles的概念吗?在误导他人之前至少编写一些代码并检查自己。
  • @Ed 我检查了您上传到 Google 文档的捆绑包,确认您缺少来自 OSGi_Carteiras_Manager 捆绑包的以下导入:javax.swing、javax.swing.border、javax.swing.event , org.aspectj.internal.lang.annotation, org.aspectj.lang.annotation, org.jfree.chart, org.jfree.chart.labels, org.jfree.chart.plot, org.jfree.data, org.jfree .data.general、org.jfree.data.time、org.jfree.data.xy。
  • @Suraj 是的,我已经尝试过了,是的,我确实知道 BREE 和配置文件。你读过我关于 OSGi 的书或博客文章吗? ;-) 您可以在 SOME 环境中使用 javax.swing 而无需导入它的原因是 Eclipse org.osgi.framework.bootdelegation=* 使用了一个讨厌的 hack。永远不要依赖这种 hack,因为它会导致 Ed 遇到的错误。在 OSGi 中使用包的正确方法是导入它。
【解决方案2】:

使用这个虚拟机参数:

-Djava.specification.version=1.6

这将迫使 Felix 提供 Java 6 的默认系统包集,其中包括 javax.swing 及其子包

【讨论】:

  • 我用了那个时间,但还不够。谢谢
【解决方案3】:

现在可以了!我在配置文件中配置了启动委托!

我把 org.osgi.framework.bootdelegation= 放在 config.ini 中。

你们两个都应该在伙计们之前告诉我这个,呵呵。现在我在 Equinox wiki 中读到,按照 OSGi 规范,我需要定义我需要使用的每个包,我认为这是正确的,因为一些定制的 VM 可以拥有比其他更多的库。

但是 Eclipse 在导入每个 java 包(如 javax.swing)的概念中不起作用。我将在 Eclipse Bugzilla 中报告这一点。

非常感谢你们!

PS:@Neil 你的书是什么?

【讨论】:

    【解决方案4】:

    您是否在捆绑包的 MANIFEST.MF 中声明了 Bundle-ClassPath

    【讨论】:

    • 不...但正如我所说,MainFrame 与激活器位于同一个包中
    • 你必须提到 Bundle-ClassPath。虽然默认情况下它可能会选择“。”但请确保...
    • hmmmm 我在日志中发现了一个嵌套的异常... 原因:java.lang.ClassNotFoundException: javax.swing.JFrame 为什么我需要声明? JFrame 在 java 默认库中。
    • 嘿嘿...我曾经在某个时候问过这个问题:stackoverflow.com/questions/1458425/…
    • Suraj,您似乎在猜测答案。如果你不知道,最好不要回答。
    猜你喜欢
    • 2017-10-02
    • 1970-01-01
    • 2014-04-29
    • 2013-06-30
    • 2016-01-17
    • 2013-08-12
    • 1970-01-01
    • 2018-02-19
    • 1970-01-01
    相关资源
    最近更新 更多