2009-06-04 57 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案例是進行此檢查的最佳選擇。