如何找到导出包的捆绑包?
我正在使用 felix 并且我有一个像“com.test”这样的字符串,我怎么知道哪个包导出了那个包?
我不想使用 PackageAdmin,因为它已被弃用,我也不想为每个包获取 Export-Package 标头并对其进行解析。
有任何想法吗?
如何找到导出包的捆绑包?
我正在使用 felix 并且我有一个像“com.test”这样的字符串,我怎么知道哪个包导出了那个包?
我不想使用 PackageAdmin,因为它已被弃用,我也不想为每个包获取 Export-Package 标头并对其进行解析。
有任何想法吗?
听起来您想以编程方式执行此操作,而不是在 Gogo shell 中……至少我会从您的问题的措辞中假设这一点。
没有真正的方法可以说“哪个包”导出给定的包,因为可以有许多包导出任何给定的包,并且该包可以被许多包从许多包中使用。如果你有一个特定的包并且你想知道哪个包com.test
为它提供包,你可以获取导入包的连接Bundle.adapt(BundleWiring.class)
,然后BundleWiring.getRequiredWires()
用来获取包的所有依赖项的提供者。
从那里你只需要找到osgi.wiring.package
你想要的包的名称空间线,然后该线的提供者将是你感兴趣的包BundleCapability
的一个。BundleRevision
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
一个快速的解决方案是遍历包,列出 id 和导出包头。
g! each (bundles) { echo ($it bundleId) (($it headers) get Export-Package) }
请注意,您需要在{
and周围放置空格}
!这会打印每个包、它的 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
命令行会很有用。你可以在这里安装它。
然后你可以这样做:
$ bnd find -e "com.example*" jars/*.jar
或者
$ bnd grep -e "com.example*" jars/*.jar
您是否尝试过:出口 | grep com.test ?