如何找到导出包的包?
我使用的是felix,我有一个像"com.test"这样的字符串,我怎么知道哪个包出口那个包?
我不想使用PackageAdmin,因为它已被弃用,我真的不想为每个bundle获取Export-Package标头并解析它.
有任何想法吗?
小智 11
听起来你想要以编程方式执行此操作,而不是在Gogo shell中...至少我会假设您的问题的措辞.
没有真正的方法可以说"哪个bundle"导出给定的包,因为可以有许多bundle导出任何给定的包,并且该包可以由许多包中的许多包使用.如果您有一个特定的包,并且您想知道哪个包提供了包com.test,那么您可以获取导入包的连接Bundle.adapt(BundleWiring.class),然后使用它BundleWiring.getRequiredWires()来获取所有包的依赖关系的提供者.
从那里你只需要找到osgi.wiring.package你想要的包的命名空间,然后该连线的提供者将是你感兴趣的包BundleCapability的一个BundleRevision.
一个快速的解决方案是迭代捆绑包,列出 id 和导出包标头。
g! each (bundles) { echo ($it bundleId) (($it headers) get Export-Package) }
Run Code Online (Sandbox Code Playgroud)
请注意,您需要在{和周围添加空格}!这将打印每个包、其 id 及其 Export-Package 标头。您可以将其放入 cmd 中:
g! exports= { each (bundles) { echo ($it bundleId) (($it headers) get Export-Package) } }
Run Code Online (Sandbox Code Playgroud)
然后您可以更轻松地使用它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
Run Code Online (Sandbox Code Playgroud)
导出包的官方命令是inspect
g! inspect cap osgi.wiring.package
Run Code Online (Sandbox Code Playgroud)
然而,输出非常混乱并且难以 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)
Run Code Online (Sandbox Code Playgroud)
不幸的是,Package Admin 方法超载,Gogo 选择第一个匹配的方法,否则会容易得多:-(
如果您有一组捆绑包,那么bnd命令行可能会很有用。您可以在此处安装它。
然后你可以这样做:
$ bnd find -e "com.example*" jars/*.jar
Run Code Online (Sandbox Code Playgroud)
或者
$ bnd grep -e "com.example*" jars/*.jar
Run Code Online (Sandbox Code Playgroud)