2009-06-04 60 views
4

假设有一个名为callme.jar如何分析在Java程序中使用哪个jar文件?

而且它位于几个目录中的JAR文件,

如何分析它们中的哪一个在运行时使用?

+0

你想从应用程序内部分析,还是从应用程序外部进行分析? – rich 2009-06-04 13:52:06

+0

external.otherwise我可以检查类路径。 – omg 2009-06-04 16:58:45

回答

3

可能不是最简单的方法,但您可以查看该进程已打开的文件并从中确定。

如果您使用的是Windows,则可以使用Process Explorer查看该进程在任何给定时间打开的文件,或Process Monitor在运行时观察文件系统访问。会有很多噪音,但你可以从那里弄清楚。

如果你在Mac上,我认为内置的活动监视器可以给你一个打开的文件列表。可悲的是,我不知道你在Linux中使用的命令。

+3

lsof -p PID - 将在Linux中列出针对特定进程的文件 – Cogsy 2009-06-04 13:43:37

22

-verbose:class参数调用java可执行文件。这将产生象输出:

[加载从文件org.apache.log4j.helpers.ThreadLocalMap:/ C:/.../ 1.2.14/log4j的-1.2.14.jar]
[加载从文件org.apache.commons.cli.Option:/ C:/.../公地-CLI-1.2.jar]

+2

如果它为每个加载的单个类输出,则可能需要将其输出为grep:java -verbose:class ... | grep'callme.jar';应该减少噪音 – Herms 2009-06-04 13:43:57

0

尝试这段代码:

//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"); 
1
System.getProperty("java.class.path"); 
+0

这个答案看似正确 - 因为JVM(或者至少Sun的?)将从包含它的类路径上的第一个位置加载类;按照类路径的顺序 – 2009-06-04 13:55:20

+0

这只有在您可以控制代码时才有效。这可能就是这种情况,但我不确定。 – Herms 2009-06-04 13:58:35

0

知道代码是否来回并不那么容易正在使用的JAR只有在你的代码调用该jar被执行时才是可能的。被覆盖)。直到你的代码没有被覆盖,很难知道你的应用程序类路径上的jar是否被使用。

为此,您可能需要正确的junit测试用例,它可以覆盖整个代码,然后您可以使用Class Dependency Analyzer工具。

这是一种尝试看东西。您可以尝试逐个删除JAR并检查应用程序是否有效,但junit案例是进行此检查的最佳选择。