Java 如何获取OSGi使用的所有jar路径?

Java 如何获取OSGi使用的所有jar路径?,java,osgi,Java,Osgi,我想获得所有可以在这些jar中搜索的jar路径。我编写了一个函数来搜索App main文件夹下的所有jar,但遇到了一个问题——一些jar包已经存在,但已经过时,并且没有被OSGi使用,例如xxxx_1.0.0.jar和xxxx_1.2.0.jar都存在,但OSGi只使用1.2.0。如果我在主文件夹中搜索,结果列表中将显示其中的一个 那么有没有办法获取OSGi使用的所有jar文件呢?然后我可以过滤掉没有使用的jar文件。 谢谢 添加: 我尝试使用这种方式获取所有捆绑包的绝对URL,但失败: St

我想获得所有可以在这些jar中搜索的jar路径。我编写了一个函数来搜索App main文件夹下的所有jar,但遇到了一个问题——一些jar包已经存在,但已经过时,并且没有被OSGi使用,例如xxxx_1.0.0.jar和xxxx_1.2.0.jar都存在,但OSGi只使用1.2.0。如果我在主文件夹中搜索,结果列表中将显示其中的一个

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

添加: 我尝试使用这种方式获取所有捆绑包的绝对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获得绝对bundle路径,但为什么它们都是相同的呢?如何获取真实路径?

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应用程序。

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应用程序。

思考捆绑包。。。只需执行bundle.getResource(clazz.getName().replace(“.”,“/”)+“.class”)


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

想想捆绑包。。。只需执行bundle.getResource(clazz.getName().replace(“.”,“/”)+“.class”)


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

同意。我猜您试图解决的问题要么已经解决,要么是错误的问题。@Philippe Marschall,您能检查我补充的信息和问题吗?谢谢。我知道你在用Equinox,在这种情况下,我推荐同意的。我猜您试图解决的问题要么已经解决,要么是错误的问题。@Philippe Marschall,您能检查我补充的信息和问题吗?谢谢。我知道你使用的是Equinox,在这种情况下,我建议你使用Equinox。你能解释一下你想要实现什么吗?您想在类文件中搜索什么?为什么?@Christian Schneider我想反编译用户输入的runtime.class的类名。我实现的方法是收集OSGi环境中的所有JAR,然后遍历这个类。实际上,xxx_1.2.0和xxx_1.0.0都包含此文件,但仅使用xxx_1.2.0。我只想反编译使用过的一个。我想我记得你不久前有一个类似的问题。在OSGi中,相同的类名可以来自不同的包,因此可以同时使用不同的版本。因此,如果您想知道类的源代码,那么还需要指定查看该类的bundle/classloader。从那里,您可以通过包连接找到类是从哪个jar加载的。@Christian Schneider,您能检查我添加的信息和问题吗?谢谢。你能解释一下你想要实现什么吗?您想在类文件中搜索什么?为什么?@Christian Schneider我想反编译用户输入的runtime.class的类名。我实现的方法是收集OSGi环境中的所有JAR,然后遍历这个类。实际上,xxx_1.2.0和xxx_1.0.0都包含此文件,但仅使用xxx_1.2.0。我只想反编译使用过的一个。我想我记得你不久前有一个类似的问题。在OSGi中,相同的类名可以来自不同的包,因此可以同时使用不同的版本。因此,如果您想知道类的源代码,那么还需要指定查看该类的bundle/classloader。从那里,您可以通过包连接找到类是从哪个jar加载的。@Christian Schneider,您能检查我添加的信息和问题吗?谢谢。这不仅比在所有JAR中搜索可能存在于多个版本中的类更可靠,而且效率更高。这不仅比在所有JAR中搜索可能存在于多个版本中的类更可靠,而且效率更高。