OSGI:只有在外部存在的情况下才能导入捆绑包,否则使用本地精简版本吗?

OSGI:只有在外部存在的情况下才能导入捆绑包,否则使用本地精简版本吗?,osgi,Osgi,我面临的问题是,应用程序部署在由第三方维护的OSGi容器上 我的包中有一些功能可以导入外部包,这些包可能可用,也可能不可用。对于捆绑包不可用的情况,我的捆绑包中存在一个客户端捆绑包(以帮助避免ClassNotFound异常)。在另一种情况下,当bundle存在时,应该导入包 这有可能吗 提前谢谢。在我看来这是不可能的。您只能选择一种解决方案: 您可以将外部包添加到包中(这不是OSGi方式)。但是,您的包在每个OSGi容器(框架)上都会运行 您必须使舒尔能够在OSGi容器(框架)上安装所需软件包的

我面临的问题是,应用程序部署在由第三方维护的OSGi容器上

我的包中有一些功能可以导入外部包,这些包可能可用,也可能不可用。对于捆绑包不可用的情况,我的捆绑包中存在一个客户端捆绑包(以帮助避免ClassNotFound异常)。在另一种情况下,当bundle存在时,应该导入包

这有可能吗


提前谢谢。

在我看来这是不可能的。您只能选择一种解决方案:

  • 您可以将外部包添加到包中(这不是OSGi方式)。但是,您的包在每个OSGi容器(框架)上都会运行

  • 您必须使舒尔能够在OSGi容器(框架)上安装所需软件包的捆绑包。捆绑包的依赖项通常必须输入到清单文件中,并且依赖项必须可用


  • 你必须做出决定
  • 您可以将外部包添加到包中(这不是OSGi方式)。但是,您的包在每个OSGi容器(框架)上都会运行

  • 您必须使舒尔能够在OSGi容器(框架)上安装所需软件包的捆绑包。捆绑包的依赖项通常必须输入到清单文件中,并且依赖项必须可用

  • 你必须做出决定

    形势 让我看看我是否正确理解了这个问题:假设我们讨论的是某个包
    foo
    。如果您的环境中有人导出此包,则您希望完全导入该包

    [someone-else] --exp--> foo <--imp-- [you]
    
    所以,你和自己联系起来了

    我还收集到,您曾尝试自己导出
    foo
    包,但发现当您这样做时,您无法使用
    foo
    包中的类与其他捆绑包通信

    解决方案 如果上述情况正确,则可以使用默认OSGi行为。您声明您同时导出和导入一个包

    Export-Package: foo
    Import-Package: foo
    
    现在,您将始终导出包,但OSGi解析机制将确保正确连接:

    • 如果有人已经导出了
      foo
      ,您将连接到该现有包,您自己的导出将暂时被“忽略”,并且
    • 如果你是唯一一个出口它的人,你将与自己联系起来
    在这两种情况下,您都会连接到其他所有人都在使用的同一个包,这正是您所需要的

    简言之,你不应该太担心这种情况,一般来说,你总是进口你出口的东西。大多数工具(,the)实际上都会为您执行此操作。如果您是手工编写清单,您应该查看这些清单,以使您的生活更轻松。

    让我看看我是否正确理解了这个问题:假设我们讨论的是某个包
    foo
    。如果您的环境中有人导出此包,则您希望完全导入该包

    [someone-else] --exp--> foo <--imp-- [you]
    
    所以,你和自己联系起来了

    我还收集到,您曾尝试自己导出
    foo
    包,但发现当您这样做时,您无法使用
    foo
    包中的类与其他捆绑包通信

    解决方案 如果上述情况正确,则可以使用默认OSGi行为。您声明您同时导出和导入一个包

    Export-Package: foo
    Import-Package: foo
    
    现在,您将始终导出包,但OSGi解析机制将确保正确连接:

    • 如果有人已经导出了
      foo
      ,您将连接到该现有包,您自己的导出将暂时被“忽略”,并且
    • 如果你是唯一一个出口它的人,你将与自己联系起来
    在这两种情况下,您都会连接到其他所有人都在使用的同一个包,这正是您所需要的


    简言之,你不应该太担心这种情况,一般来说,你总是进口你出口的东西。大多数工具(,the)实际上都会为您执行此操作。如果您是手工编写清单,您应该查看这些清单,以使您的生活更轻松。

    感谢您指出这一点。感谢您指出这一点。我一直在阅读动态导入。这不可能奏效吗?查找包的来源的优先级是什么?如果在包清单中声明所需的包,OSGi框架将尝试在其框架中查找该包。您不能指定在哪个包中声明该包。这是默认的方式。要确保所需的包可用,必须将所需的包添加到类路径。我没听说过OSGi上下文中的动态导入!你能把你读到的东西贴在哪里吗?或者你是说动态服务???我一直在读动态导入。这不可能奏效吗?查找包的来源的优先级是什么?如果在包清单中声明所需的包,OSGi框架将尝试在其框架中查找该包。您不能指定在哪个包中声明该包。这是默认的方式。要确保所需的包可用,必须将所需的包添加到类路径。我没听说过OSGi上下文中的动态导入!你能把你读到的东西贴在哪里吗?还是说动态服务???