找到导出包的OSGI捆绑包吗?

找到导出包的OSGI捆绑包吗?,osgi,apache-felix,Osgi,Apache Felix,如何找到导出包的捆绑包 我使用的是felix,我有一个类似“com.test”的字符串,如何知道哪个包导出该包 我不想使用PackageAdmin,因为它已经被弃用了,我也不想获取每个包的导出包头并对其进行解析 有什么想法吗?您尝试过: 导出| grep com.test?听起来您希望以编程方式执行此操作,而不是在Gogo shell上执行此操作。。。至少从你问题的措辞来看,我会这样假设 没有真正的方法来说明“哪个捆绑包”导出给定的包,因为可以有许多捆绑包导出任何给定的包,并且该包可以被许多捆绑

如何找到导出包的捆绑包

我使用的是felix,我有一个类似“com.test”的字符串,如何知道哪个包导出该包

我不想使用PackageAdmin,因为它已经被弃用了,我也不想获取每个包的导出包头并对其进行解析

有什么想法吗?

您尝试过:
导出| grep com.test?

听起来您希望以编程方式执行此操作,而不是在Gogo shell上执行此操作。。。至少从你问题的措辞来看,我会这样假设

没有真正的方法来说明“哪个捆绑包”导出给定的包,因为可以有许多捆绑包导出任何给定的包,并且该包可以被许多捆绑包使用。如果您有一个特定的bundle,并且您想知道哪个bundle向它提供了包
com.test
,那么您可以获取导入bundle的wiring
bundle.adapt(BundleWiring.class)
,然后使用
BundleWiring.getRequiredWires()
获取该bundle的所有依赖项的提供者


从那里你只需要找到你想要的包的
osgi.willing.package
名称空间的连接,然后该连接的提供者将是你感兴趣的包的
bundleVision
BundleCapability

Apache Felix osgi控制台的最新版本包括一个“依赖项查找器”列出导出给定包或类的捆绑包的插件。在上有一些屏幕截图(提到CQ5,但插件并不依赖于此)


这在管理员级别非常有用,如果您需要在代码中找到它,您可以查看该插件的源代码,请参见

快速解决方案是迭代包,列出id和导出包头

g! each (bundles) { echo ($it bundleId) (($it headers) get Export-Package) }
请注意,您需要在
{
}
之间加空格!这将打印每个捆绑包及其id和导出包头。您可以将其放入cmd中:

g! exports= { each (bundles) { echo ($it bundleId) (($it headers) get Export-Package) } }
然后,您可以更轻松地使用
grep

g! exports | grep webconsole
12 org.apache.felix.webconsole;version="3.3.0";uses:="javax.servlet,javax.servlet.http,org.osgi.framework",org.apache.felix.webconsole.bundleinfo;version="1.0.0";uses:="org.osgi.framework",org.apache.felix.webconsole.i18n;version="1.0.0";uses:="org.osgi.framework"
true
导出包的官方命令是
inspect

g! inspect cap osgi.wiring.package
然而,输出非常混乱,很难进行grep。但是,如果您知道包名,则可以询问(已弃用)包管理员

g! r=servicereference org.osgi.service.packageadmin.PackageAdmin
....
g! pa=service $r
org.apache.felix.framework.PackageAdminImpl@2c7b40e3
g! $pa exportedpackages org.osgi.framework
org.osgi.framework; version=1.10.0
org.osgi.framework; version=1.9.0
org.osgi.framework; version=1.10.0
org.osgi.framework; version=1.9.0
g! each ($pa exportedpackages org.osgi.framework) { $it exportingbundle  }
0|Active     |    0|org.apache.felix.framework (0.1.0.SNAPSHOT)
不幸的是,包管理方法过载,Gogo会选择第一个匹配的方法,否则会容易得多:-(

如果您有一组bundle,那么
bnd
命令行可能很有用。您可以安装它

然后,您可以执行以下操作:

$ bnd find -e "com.example*" jars/*.jar


对不起,我应该说我想做这个程序这基本上就是我要找的。遗憾的是我必须检查所有的包并检查这一点。我希望在框架上有一个方法说,这是一个包,哪个包满足它?假设这是框架在幕后做的,当它无论如何都要解决依赖关系。但是无论如何,谢谢你的回答。
$ bnd grep -e "com.example*" jars/*.jar