【问题标题】:How to link OSGI bundles on eclipse?如何在 Eclipse 上链接 OSGI 包?
【发布时间】:2018-03-17 17:00:33
【问题描述】:

我正在使用 serviceMix 来部署我的捆绑包。而我使用 maven 来创建我的包如下:

        <plugin>
            <groupId>org.apache.felix</groupId>
            <artifactId>maven-bundle-plugin</artifactId>
            <version>2.3.6</version>
            <extensions>true</extensions>
            <configuration>
                <instructions>
                    <Bundle-SymbolicName>${project.groupId}.${project.artifactId}</Bundle-SymbolicName>
                    <Bundle-Description>${project.description}</Bundle-Description>
                    <Bundle-Activator>mycom.project.PubSub.activator.Activator</Bundle-Activator>
                    <Import-Package>*,org.apache.camel.osgi,org.java_websocket.*, mycom.project.ManageSQL.Interface.SQLInterface
                    </Import-Package>
                    <Export-Package>mycom.project.PubSub.Manager.Manager</Export-Package>
                    <Private-Package>org.java_websocket.*, mycom.project.PubSub.*, io.socket.*, okhttp3.*, okhttp3.internal.connection, okio.*, org.json.*</Private-Package>
                    <BundleType>project</BundleType>
                </instructions>
            </configuration>
        </plugin>  

我从我的其他捆绑包中导入一个类,如下所示:

<Import-Package>*,org.apache.camel.osgi,org.java_websocket.*, mycom.project.ManageSQL.Interface.SQLInterface</Import-Package>

但是当我尝试在我当前的 Bundle 中访问它时,它给我的错误是没有这样的类。
我正在使用 eclipse 和 maven 创建捆绑包并将它们部署在 serviceMix 上。
这是我尝试使用该捆绑包的 pom 项目的图像。

下面是我创建并希望使用其导入包的包的图像。

【问题讨论】:

    标签: eclipse maven apache-karaf apache-felix apache-servicemix


    【解决方案1】:

    您为 maven bundle 插件提供的配置非常不寻常,可能与您实际想要的不匹配。

    <Bundle-SymbolicName>${project.groupId}.${project.artifactId}</Bundle-SymbolicName>
    <Bundle-Description>${project.description}</Bundle-Description>
    

    这两个条目很好,虽然我相信 ${project.groupId}.${project.artifactId} 是使用 maven 捆绑插件时捆绑符号名称的默认值,因此可以省略

    <Bundle-Activator>mycom.project.PubSub.activator.Activator</Bundle-Activator>
    

    通常不建议使用BundleActivator,因为它是一个极低级别的入口点。有很多锋利的边缘,很容易把事情弄错。通常建议您使用诸如声明式服务之类的组件框架,它为您完成了大部分艰苦的工作。这是声明激活器类的正确方法,但其他读者要小心。

    <Import-Package>*, org.apache.camel.osgi, org.java_websocket.*, mycom.project.ManageSQL.Interface.SQLInterface</Import-Package>
    

    这是一个写得很糟糕的Import-Package 指令。一般来说,你不应该指定这个标题,插件会为你计算出正确的列表。如果您确实指定了此标头,那么它是高级用法,您必须小心。

    首先,此标头是错误的,因为标记被视为过滤器列表并依次解释。从* 开始,标题的其余部分无关紧要。

    其次,此标头必须是包列表(或全局匹配/否定),并且不得包含类名。如果mycom.project.ManageSQL.Interface.SQLInterface 不是类名,那么它严重违反了Java 命名约定。

    我建议您完全删除您的 Import-Package 配置条目。

    <Export-Package>mycom.project.PubSub.Manager.Manager</Export-Package>
    

    Import-Package 指令一样,Export-Package 必须采用包名,而不是类名。

    <Private-Package>org.java_websocket.*, mycom.project.PubSub.*, io.socket.*, okhttp3.*, okhttp3.internal.connection, okio.*, org.json.*</Private-Package>
    

    这条Private-Package 指令(与Export-Package 指令相结合)负责决定哪些类最终会打包到你的包中。将另一个包中的依赖项重新打包到您自己的包中是不寻常的(尽管并非闻所未闻)。这有点像本机可执行文件中的静态链接,但是您需要非常小心,避免重新打包通过 API 公开的内容,以避免在运行时出现严重问题。

    Private-PackageExport-Package 只能包含编译类路径中的包。猜测这就是为什么你的包不包含你期望的东西,尽管我会质疑你为什么要重新打包这些包。

    <BundleType>project</BundleType>
    

    这是全局命名空间中的自定义标头。我建议使用贵公司更容易识别的独特内容,或者如果它没有实际用途,则删除标题。

    【讨论】:

      猜你喜欢
      • 2012-12-23
      • 2020-01-27
      • 2012-10-05
      • 1970-01-01
      • 2012-04-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-06
      • 2016-01-01
      相关资源
      最近更新 更多