【问题标题】:OSGI Bundle vs jar dependencyOSGI Bundle vs jar 依赖
【发布时间】:2013-02-01 13:04:04
【问题描述】:

我正在尝试了解以下内容之间的区别

    <dependency>
        <groupId>com.myspace.order</groupId>
        <artifactId>dal</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </dependency>

    <dependency>
        <groupId>com.myspace.order</groupId>
        <artifactId>dal</artifactId>
        <version>1.0.0-SNAPSHOT</version>
        <type>bundle</type>
    </dependency>

dal 工件本身具有指定为 bundle 的包装:

<packaging>bundle</packaging>

现在,当我部署 dal 工件时,我看到它作为 jar 发布在 repo 中(其中包含清单)。在这种情况下,我对 dal 的依赖应该是什么。它应该是 bundle 还是 jar 类型?如果我在做 OSGI,我认为方法是将类型指定为 bundle。它是否正确?或者,我可以在这里有一个 jar 依赖项吗?

【问题讨论】:

    标签: maven jar dependencies osgi bundle


    【解决方案1】:

    当你在 Maven 中声明一个依赖时,你只能依赖一个普通的 Jar,而不是一个 bundle,因为 Maven 不承认 OSGi 环境的限制。

    看到这个问题:

    Why can't maven find an osgi bundle dependency?

    在你编译你的项目时,你不需要担心(但应该!)关于 OSGi 环境...例如,如果你尝试使用不是由你的包导出的包,它不会抱怨'取决于....

    当你尝试在 OSGi 容器中部署你的包时,如果你正确地声明了你对你使用的“dal”包的依赖,当然包括版本(通常你应该让 maven-bundle-plugin 去做为您基于您的 POM),只有在容器中有一个捆绑包以正确的版本(或版本范围)导出所需的包时才会解决。

    考虑到“dal”似乎已经是一个捆绑包,您只需确保将捆绑包和“dal”部署在一起,一切都会正常工作。

    但是,如果您错误地添加了对“dal”的私有包的依赖项,尽管 Maven 会很乐意为您编译它,但当您将它扔到 OSGi 中时,您会遇到一个讨厌的接线异常:)

    请注意,bundle 只是一个普通的 jar,其中包含清单中的 OSGi 元数据(Bundle-SymbolicName、Bundle-Version 等)。因此,如果您不使用 OSGi,则捆绑包将像任何其他 jar 一样工作。

    但无论如何,如果您想了解更多信息,请查看以下问题:

    What is the meaning of type "bundle" in a maven dependency?

    【讨论】:

    • “例如,如果你尝试使用不是由你依赖的包导出的包,它不会抱怨......”这是否意味着在运行时强制执行(并检测到)OSGI 依赖项?我在想导出包是在编译时验证的。
    • 当您在 OSGi 容器中安装包时,依赖关系将被解决。由于 OSGi 是一个动态环境,您可以随时安装捆绑软件...如果捆绑软件进入 RESOLVED 状态,那么它可能已启动。也就是说,安装是一种动态编译……如果bundle通过了,保证在安装的时候,所有的import都满足了,就可以开始bundle了。
    • 在您实际尝试安装它之前,OSGi 无法解决您的捆绑包依赖关系,因为这将取决于安装时可用的捆绑包集。另一方面,Maven 使用正常的 Java 编译过程,忽略 OSGi 可见性规则……这是主要区别。
    猜你喜欢
    • 2012-10-18
    • 2014-11-01
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 2014-09-12
    • 2013-11-02
    相关资源
    最近更新 更多