【问题标题】:Force Imports in Apache Karaf在 Apache Karaf 中强制导入
【发布时间】:2015-04-24 15:05:06
【问题描述】:

我有一个主要处理接口的包,它使用来自第三方 jar 的工厂来获取它正在使用的接口的实例。 例如,

my-bundle.jar 有...

com.oth.itf.Intrface itf = Fctry.getInstance('ABC');

有

imports-package for com.oth.itf

third-party.jar 有..

public static com.oth.itf.Intrface getInstance(String abc) {
   if (...) {
       return new com.oth.impl.ItfInstance();
   }
}

有exports-package for com.oth.itf and com.oth.impl

一切正常,捆绑也被部署,但问题是我得到了

ItfInstance 的 ClassNotFoundException

在

我的包

当代码被执行时。

我尝试为 com.oth.impl 添加 import-package 但无济于事。当我添加了一个

com.oth.impl.ItfInstance 的虚拟声明

my-bundle.jar 中的某个位置。看起来,Karaf 只有在我们明确使用它们时才会获得导入。有没有更好的办法?有没有办法强制 Karaf 导入包,即使我们没有明确使用它们?

【问题讨论】:

  • 不,这不是 OSGi 中导入的工作方式。导入就是导入,没有“强制”选项。由于没有发布清单,因此无法判断您的示例中到底出了什么问题。
  • 好吧,我没有示例,但我可以告诉你 pom.xml 具有特定包的导入包,但清单没有,因为该包尚未在代码中明确使用.
  • 如果清单不导入包,则不导入包。时期。清单是如何以这种方式结束的?谁知道。这是一个构建问题,因此您必须提供构建系统的详细信息。

标签: osgi apache-karaf


【解决方案1】:

Neil 是对的,如果没有在代码中使用它就无法导入。有了 Karaf,您就有可能提供帮助。使用命令 bundle:dynamic-import 您可以在运行时向捆绑包添加动态导入。有了这个,你可以通过 bundle:headers 找到实际需要的导入,你会找到这个包的导入包。拿走这些并将那些缺少的导入添加到您的清单生成中并设置好。

【讨论】:

    【解决方案2】:

    如果您没有 bundle: 选项,请使用此 dev: 命令:

    dev:dynamic-import <BundleID>
    

    这允许 Karaf 在运行时导入依赖项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-19
      • 1970-01-01
      • 2023-03-30
      • 2018-05-06
      • 1970-01-01
      • 2011-10-19
      • 1970-01-01
      • 2012-07-23
      相关资源
      最近更新 更多