假设有一个名为callme.jar的jar文件
它位于多个目录中,
如何分析在运行时使用哪一个?
答案 0 :(得分:28)
使用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]
答案 1 :(得分:3)
可能不是最简单的方法,但您可以查看进程打开的文件并从中确定。
如果你在Windows上,可以使用Process Explorer查看进程在任何给定时间打开的文件,或Process Monitor在运行时查看文件系统访问权限。会有很多噪音,但你可以从那里弄清楚。
如果您使用的是Mac,我认为内置的Activity Monitor可以为您提供打开文件的列表。可悲的是,我不知道你在Linux中使用的命令。
答案 2 :(得分:2)
System.getProperty("java.class.path");
答案 3 :(得分:1)
试试这段代码:
//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");
答案 4 :(得分:0)
要知道是否正在使用来自JAR的代码片段,只有在调用该jar的代码正在执行(即被覆盖)时,才能实现这一点并不容易。直到你的代码没有被覆盖,很难知道你的应用程序类路径上的jar是否被使用。
为此你可能需要找到可以覆盖整个代码的好的junit测试用例,然后你可以使用Class Dependency Analyzer工具。
有点尝试看东西。您可以尝试逐个删除JAR并检查应用程序是否有效,但是junit情况是进行此检查的最佳选择。