假设有一个名为 callme.jar 的 jar 文件
它位于几个目录中,
如何分析其中哪一个在运行时使用?
使用参数调用java
可执行文件-verbose:class
。这将产生如下输出:
[从文件加载 org.apache.log4j.helpers.ThreadLocalMap:/C:/.../1.2.14/log4j-1.2.14.jar]
[从文件加载 org.apache.commons.cli.Option:/C :/.../commons-cli-1.2.jar]
可能不是最简单的方法,但您可以查看进程打开了哪些文件并从中确定。
如果您在 Windows 上,您可以使用Process Explorer查看该进程在任何给定时间打开了哪些文件,或者使用Process Monitor在文件系统运行时观察文件系统访问。会有很多噪音,但你可以从那里弄清楚。
如果您使用的是 Mac,我认为内置的活动监视器可以为您提供打开文件的列表。遗憾的是,我不知道您在 Linux 中使用的命令。
System.getProperty("java.class.path");
试试这段代码:
//Get the System Classloader
ClassLoader sysClassLoader = ClassLoader.getSystemClassLoader();
//Get the URLs
URL[] urls = ((URLClassLoader)sysClassLoader).getURLs();
System.out.println("CURRENT CLASSPATH :");
for(int i=0; i< urls.length; i++){
System.out.println(urls[i].getFile());
}
System.out.println("END OF CLASSPATH");
要知道是否正在使用 JAR 中的一段代码并不是那么容易,只有在调用该 jar 的代码正在执行(即被覆盖)时才有可能。直到您的代码未被覆盖为止,很难知道您的应用程序类路径上的 jar 是否正在使用。
为此,您可能需要正确的 junit 测试用例,它可以覆盖您的整个代码,然后您可以使用类依赖分析器工具。
这是一种尝试和观察的事情。您可以尝试逐个删除 JAR 并检查应用程序是否有效,但 junit 案例是进行此检查的最佳选择。