如何找到导出包的包?
我正在使用felix并且我有一个像“com.test”这样的字符串,我怎么知道哪个包导出该包?
我不想使用PackageAdmin,因为它已被弃用,我真的不想获得每个bundle的Export-Package标头并解析它。
有什么想法吗?
答案 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