【问题标题】:How to get all jar paths used by OSGi?如何获取 OSGi 使用的所有 jar 路径?
【发布时间】:2012-07-03 01:41:33
【问题描述】:

我想获取可以在这些 jar 中搜索 .class 文件的所有 jar 路径。我编写了一个函数来搜索 App 主文件夹下的所有 jar,但遇到了一个问题——一些 jar 包存在但已过时,OSGi 未使用,例如。 xxxx_1.0.0.jar 和 xxxx_1.2.0.jar 都存在,但 OSGi 只使用了 1.2.0。如果我在主文件夹中搜索,其中是否会出现在结果列表中。

那么有没有办法获取 OSGi 使用的所有 jar 文件?然后我可以过滤掉没有使用的jar文件。 谢谢

添加: 我尝试用这种方式获取所有Bundles的绝对URL,但是失败了:

StringBuffer sb = new StringBuffer();
Bundle[] bundles = com.ibm.director.services.storage.debugtool.Activator.context.getBundles();
for (Bundle bundle : bundles) {
    java.net.URL url = bundle.getClass().getProtectionDomain().getCodeSource().getLocation();
    sb.append("File:" + url.getFile() + ", Path:" + url.getPath() + "\n");
}

但是下面的输出重复了一百次:

File:/opt/ibm/director/lwi/runtime/core/eclipse/plugins/org.eclipse.osgi_3.4.3.R34x_v20081215-1030-RCP20120203-1500.jar
File:/opt/ibm/director/lwi/runtime/core/eclipse/plugins/org.eclipse.osgi_3.4.3.R34x_v20081215-1030-RCP20120203-1500.jar, 
File:....

使用的bundle数量是:588,可能是正确的,我们可以从API中获取Bundles的绝对路径,但为什么它们都一样?我怎样才能得到真正的路径?

【问题讨论】:

  • 您能解释一下您想要实现的目标吗?你想在类文件中搜索什么,为什么?
  • @Christian Schneider 我想反编译用户输入的类名的运行时 .class。我实现的方式是收集 OSGi 环境中的所有 jars 并搜索这个类。实际上 xxx_1.2.0 和 xxx_1.0.0 都包含这个文件,但只使用了 xxx_1.2.0。我只想反编译用过的。
  • 我想我记得你前段时间有一个类似的问题。在 OSGi 中,相同的类名可以来自不同的包,因此可以同时使用不同的版本。因此,如果您想知道一个类的来源,那么您还需要指定看到该类的包/类加载器。从那里你可以从包的接线中找出类是从哪个 jar 加载的。
  • @Christian Schneider,你能检查我添加的信息和问题吗?谢谢。

标签: java osgi


【解决方案1】:

BundleContext#getBundles() 为您提供所有捆绑包。然后,您可以比较符号名称和版本。但是,仅仅因为您同时拥有 xxxx_1.0.0.jar 和 xxxx_1.2.0.jar 并不意味着未使用 xxx_1.0.0.jar。可能还有其他一些需要 xxx_1.0.0.jar 的包。同样,仅仅因为一个包没有启动并不意味着它以后不会启动。您确实想要重新实现 OSGi 解析器。如果您想清理存储库,我建议您使用存储库供应商提供的应用程序,例如 p2 中的 GC 应用程序。

【讨论】:

  • 同意。我猜你要解决的问题要么已经解决,要么是错误的问题。
  • @Philippe Marschall,你能检查我添加的信息和问题吗?谢谢。
  • 我看到你在使用 Equinox,在这种情况下我推荐p2 garbage collector application
【解决方案2】:

考虑捆绑...只需执行 bundle.getResource( clazz.getName().replace('.','/')+".class")

在重新编译之前,请查看包:"OSGI-OPT/src/" + clazz.getName().replace('.','/')+".java",实际的源代码可能在那里.

【讨论】:

  • 这不仅比在所有 jar 中搜索可能存在于多个版本中的类更可靠,而且效率更高。
猜你喜欢
  • 2015-03-22
  • 2020-12-09
  • 2017-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-19
  • 2016-05-09
  • 2014-10-16
相关资源
最近更新 更多