我在 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/