【发布时间】: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,你能检查我添加的信息和问题吗?谢谢。