如何在eclipse上链接OSGI包?

时间:2017-10-05 23:56:39

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

我正在使用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创建bundle并在serviceMix上部署它们 这是我正在尝试使用该捆绑包的pom项目的图像。

enter image description here

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

enter image description here

1 个答案:

答案 0 :(得分:0)

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

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

这两个条目没问题,但我相信${project.groupId}.${project.artifactId}是使用maven bundle插件时bundle的符号名的默认值,因此可以省略

<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指令。通常,您不应该在所有中指定此标头,插件将为您计算正确的列表。如果您确实指定了此标题,那么它是高级用法,您必须小心。

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

其次,此标头必须是包列表(或glob匹配/否定),并且不得包含类名。如果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>

这是全局命名空间中的自定义标头。我建议使用一些对您的公司来说更加独特的东西,或者如果它不符合实际目的则删除标题。