无法从OSGI中的另一个包中导入另一个包

问题描述:

我在Eclipse中有一个多模块maven项目。我尝试从一个模块/软件包中导出软件包,因此可以在另一个模块中访问它。
但我无法访问另一个包中的包/类。无法从OSGI中的另一个包中导入另一个包

我的,项目结构如下:

MainProject 
    Module1 
     subModuleA 
     subModuleB 
     subModuleC 
    Module2 
    Module3 

我汇入单词数一个包,并希望在subModuleC使用它,但是当我键入软件包的名称,它是不可访问。
我使用Apache ServiceMix和Apache Karaf编写和部署我的Bundle。 pom.xml中的
部分可以看到下面:
(还有什么BundleType我应该选择我捆绑???)

单词数的配置:

 <configuration> 
      <instructions> 
       <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName> 
       <Bundle-Description>${project.description}</Bundle-Description> 
       <Import-Package>*;resolution:=optional</Import-Package>      
       <Export-Package>org.MyProj.ManageSQL.Interface.*, org.postgresql.*, com.mysql.jdbc.*</Export-Package> 
       <Private-Package>org.MyProj.ManageSQL.*, org.json</Private-Package> 
       <BundleType>??</BundleType> 
      </instructions> 
     </configuration> 

subModuleC的配置:

 <configuration> 
      <instructions> 
       <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName> 
       <Bundle-Description>${plantcockpit.os.description}</Bundle-Description> 
       <Import-Package> 
        org.apache.camel.osgi, 
        org.MyProj.ManageSQL.Interface.SqlService, 
        com.fasterxml.jackson.core, 
        com.fasterxml.jackson.databind.*, 
        com.fasterxml.jackson.module.jsonSchema.*, 
        org.apache.commons.net.ftp.*, 
        *   
       </Import-Package> 
       <Export-Package> 
        org.MyProj.SubModuleC 
       </Export-Package> 
       <Private-Package> 
        org.MyProj.SubModuleC.*, 
        org.json, 
       </Private-Package> 
       <Bundle-Type>???</Bundle-Type> 
      </instructions> 
     </configuration> 
+0

你可能根本不需要那些'Import-Package'块。删除它们。尤其是附加到Module3的...为什么你想要一个bundle的所有进口可选?关于'Bundle-Type',没有这样的OSGi头文件,所以你可以删除它。或者把你喜欢的东西放在那里,我想。 –

+0

'私人包裹'部分也是毫无意义的。 –

为什么要导出org.postgresql包?如果你需要包装,只需安装官方jar。嵌入并导出它可能会导致一些奇怪的依赖链或类加载问题。 org.json也一样。
公共图书馆应该生活在自己的包中。如果你想/需要将它们嵌入你的包中,你必须know what you are doing

我建议你将解决进口和出口的工作留给maven-bundle-plugin。当你的捆绑工作,然后手动调整。

<plugin> 
    <groupId>org.apache.felix</groupId> 
    <artifactId>maven-bundle-plugin</artifactId> 
    <version>3.3.0</version> 
    <extensions>true</extensions> 
    <configuration> 
     <instructions> 
      <Import-Package> 
       * 
      </Import-Package> 
      <Export-Package> 
       !this.package.will.not.be.exported, 
       * 
      </Export-Package> 
     </instructions> 
    </configuration> 
</plugin> 

有一些工具可以在运行时检查包的导入/导出。从Karaf console类型headers <bundleid>imports <bundleid>。卡拉夫会告诉你什么包是从哪个包导入的。

+0

' * ImportPackage>'是多余的,因为这是默认值。 –