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

标签 java osgi osgi-bundle blueprint-osgi

我在 Eclipse 中有一个多模块 Maven 项目。我尝试从一个模块/ bundle 导出包,以便可以在另一个模块中访问它。
但我无法访问另一个包中一个包的包/类。

我的项目结构如下:

MainProject  
    Module1  
        subModuleA  
        subModuleB  
        subModuleC  
    Module2  
    Module3  

我从 Module3 导入一个包并想在 subModuleC 中使用它,但是当我输入包名称时,它无法访问。
我正在使用 Apache ServiceMix 和 Apache Karaf 来编写和部署我的 bundle 。
POM.xml的部分内容如下:
(另外我应该为我的 bundle 选择什么 BundleType???)

模块3的配置:

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

子模块C的配置:

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

最佳答案

为什么要导出 org.postgresql包裹?如果需要该包,只需安装官方 jar 即可。嵌入它并导出它可能会导致一些奇怪的依赖链或类加载问题。 org.json 相同.
公共(public)库应该存在于它们自己的包中。如果您想要/需要将它们嵌入到您的 bundle 中,您必须 know what you are doing .

我建议你把解决 import/export 的工作交给maven-bundle-plugin 。当你的 bundle 工作时,然后手动调整。

<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 将向您显示导入了哪些包以及从哪个包中导入的包。

关于java - 无法在 OSGI 中从另一个包导入一个包的包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46650054/

相关文章:

java - 如何在绘制到 Canvas 之前为位图设置坐标

eclipse - Eclipse 功能集成测试的最佳实践

eclipse-plugin - 如何将 jar 非 osgi jar 文件添加为 eclipse 插件的依赖项?

java - 获取已在 OSGi 中注册的服务时发生 ClassCastException

java - 使用 Spring OSGi 时,BundleActivator 无法解析为类型

java - 获取bean验证失败的字段名

java - 如何检查内部服务是否抛出异常?

java - 将 OSGI 事件标记为已处理

spring - 结合 OSGi 蓝图和 spring 配置

java-为什么我的 "deposit"方法不适用于带有 gui 的 ATM?