2017-10-05 67 views
2

我正在使用serviceMix来部署我的包。而我使用maven创建我的包如下:如何在eclipse上链接OSGI包?

 <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> 

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

enter image description here

及以下就是我创建并想使用它的导入包捆的形象。

enter image description here

回答

0

您为Maven的捆绑插件提供的配置是相当不寻常的,而且可能不符合你真正想要的东西。

<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是通常不推荐,因为它是非常低级的入口点。有很多尖锐的边缘,容易让事情发生严重错误。通常情况下,你会被推荐使用一个组件框架,比如Declarative Services,它为你做了大部分的努力工作。这是宣布激活课程的正确方法,但其他读者请注意。

<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> 

这是全局名称空间中的自定义标题。我会建议使用对您的公司更为独特的东西,或者如果它没有实际用途,请删除标题。