找到导出包的OSGI包?

时间:2012-08-11 13:00:31

标签: osgi apache-felix

如何找到导出包的包?

我正在使用felix并且我有一个像“com.test”这样的字符串,我怎么知道哪个包导出该包?

我不想使用PackageAdmin,因为它已被弃用,我真的不想获得每个bundle的Export-Package标头并解析它。

有什么想法吗?

4 个答案:

答案 0 :(得分:11)

听起来你想以编程方式执行此操作,而不是在Gogo shell中...至少我会假设你的问题的措辞。

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

从那里你只需要为你想要的软件包找到osgi.wiring.package命名空间的连线,那么该网络的提供者将是你BundleCapability的{​​{1}}个软件包的BundleRevision有兴趣。

答案 1 :(得分:3)

Apache Felix OSGi控制台的最新版本包含一个“依赖查找器”插件,其中列出了导出给定包或类的包。 http://www.6dlabs.com/blog/dklco/2012-05-04/new-cq-55-dependency-finder有一些屏幕截图(提到CQ5但插件并不依赖于此。)

这在管理员级别很有用,如果你需要在代码中找到它,你可以查看该插件的源代码,请参阅https://issues.apache.org/jira/browse/FELIX-3045

答案 2 :(得分:2)

你试过了吗? 出口| grep com.test?

答案 3 :(得分:0)

一种快速的解决方案是遍历分发包,列出ID和导出程序包头。

g! each (bundles) { echo ($it bundleId) (($it headers) get Export-Package) }

请注意,您需要在{}周围加空格!这将为每个包,其ID和Export-Package标头打印。您可以将其放在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)

不幸的是,Package Admin方法已重载,而Gogo选择了第一个匹配的方法,否则会容易很多:-(

如果您有捆绑包,那么bnd命令行可能会有用。您可以安装here

您可以执行以下操作:

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

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