【问题标题】:Equinox: classes correctly exported and imported by bundles, still getting ClassNotFoundExceptionEquinox:通过包正确导出和导入的类,仍然得到 ClassNotFoundException
【发布时间】:2011-08-17 01:00:29
【问题描述】:

我在 OSGi 中开发时遇到了以下障碍。一组负责持久性的包使用com.mysql.jdbc.Driver 类,由另一个(Springsource EBR 配置)包提供。在另一个包中,我将 Quartz 调度程序库配置为使用数据库作为作业存储。这也是使用 MySQL 驱动程序完成的。然而,在运行时,我得到一个ClassNotFoundException。这很奇怪,因为持久性仍然正常工作。更奇怪的是,当我尝试手动加载类时,使用Class.forName("com.mysql.jdbc.Driver") 加载正确,这意味着该类确实可以加载。

巧合与否,Drools 似乎也发生了同样的事情……我将一些最新的 Drools jar 重新打包为 OSGi 包,部署它们,当再次运行时,ClassNotFoundException 会弹出。在这两种情况下,所有供应商捆绑包都会添加到清单中的必需捆绑包中。

这个奇怪的问题有没有敲响警钟?我很高兴听到这个消息......

【问题讨论】:

  • 您可以/应该使用 Equinox 控制台中的“headers”命令验证包是否具有正确的 Export-PackageImport-Package 标头。
  • @Progman:谢谢你的回复。问题似乎不是任何不正确的导入或导出语句,而是类加载本身,cfr。我的回答。

标签: java osgi classloader equinox classnotfoundexception


【解决方案1】:

这似乎是 Equinox 中的类加载问题。我尝试使用 DynamicImport-PackageEclipse-BuddyPolicy 标头修复此问题,但没有太大成功。最终我通过自己将最新版本的 Quartz 重新打包为一个包来解决这个问题,并在包中添加了 MySql jar。这不是最漂亮或最优雅的解决方案,但现在必须这样做。如果有人能告诉我更多关于类加载的信息,请随时回复!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    • 2015-12-19
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 2016-05-23
    • 2016-05-16
    相关资源
    最近更新 更多