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 テスト ケースを正しく設定する必要がある場合があります。その後、Class Dependency Analyzer ツールを使用できます。
それは一種の試してみるものです。JAR を 1 つずつ削除して、アプリケーションが機能するかどうかを確認できますが、この検査を行うには junit ケースが最適なオプションです。