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

时间:2017-10-09 15:31:35

标签: java osgi osgi-bundle blueprint-osgi

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

我的项目结构如下:

proc sql;
select id,m1,m2,m3,m4,m5
     , max(m1,m2,m3,m4,m5) as max_marks
from data1
;
quit;

我从Module3导入一个包并希望在subModuleC中使用它,但是当我输入包名时,它无法访问。
我正在使用Apache ServiceMix和Apache Karaf来编写和部署我的Bundles POM.xml的一部分可以在下面看到:
(另外我应该选择BundleType作为我的Bundles ???)

Module3的配置:

MainProject  
    Module1  
        subModuleA  
        subModuleB  
        subModuleC  
    Module2  
    Module3  

subModuleC的配置:

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

1 个答案:

答案 0 :(得分:1)

为什么要导出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>

有一些工具可以在运行时检查bundle的导入/导出。来自Karaf console类型headers <bundleid>imports <bundleid>。 Karaf将向您展示哪些包是从哪个包中导入的。