私のコードはClassNotFoundException
.
コマンドプロンプトの実行から、クラスを含むjarファイルが確実にクラスパス上にあることがわかります。
JVM からクラスパス上のクラスのリストをダンプする方法はありますか? (理想的には、いくつかの Java コード)。
(ディレクトリ内のクラスを見たくありません。JVM にロードされているもののリストを見たいのです)。
私のコードはClassNotFoundException
.
コマンドプロンプトの実行から、クラスを含むjarファイルが確実にクラスパス上にあることがわかります。
JVM からクラスパス上のクラスのリストをダンプする方法はありますか? (理想的には、いくつかの Java コード)。
(ディレクトリ内のクラスを見たくありません。JVM にロードされているもののリストを見たいのです)。
クラスローダーを調べて、ロード元の URL をダンプすることにより、クラスパスをプログラムで表示できます。
このようなもの:
import java.net.URLClassLoader;
import java.util.Arrays;
public class ClasspathDumper
{
public static void main(String... args)
{
dumpClasspath(ClasspathDumper.class.getClassLoader());
}
public static void dumpClasspath(ClassLoader loader)
{
System.out.println("Classloader " + loader + ":");
if (loader instanceof URLClassLoader)
{
URLClassLoader ucl = (URLClassLoader)loader;
System.out.println("\t" + Arrays.toString(ucl.getURLs()));
}
else
System.out.println("\t(cannot display components as not a URLClassLoader)");
if (loader.getParent() != null)
dumpClasspath(loader.getParent());
}
}
次のような出力が生成されます。
Classloader sun.misc.Launcher$AppClassLoader@2a340e:
[file:/C:/Java/workspaces/myproject/bin/]
Classloader sun.misc.Launcher$ExtClassLoader@bfbdb0:
[file:/C:/Java/jdk/jdk1.7.0/jre/lib/ext/dnsns.jar, file:/C:/Java/jdk/jdk1.7.0/jre/lib/ext/localedata.jar, file:/C:/Java/jdk/jdk1.7.0/jre/lib/ext/sunec.jar, file:/C:/Java/jdk/jdk1.7.0/jre/lib/ext/sunjce_provider.jar, ...]
..? (理想的には、いくつかの Java コード)
Class-Not-Found バグを解決することだけを考えていた場合、アプリ内にダンプ コードを追加すると、後で無効にするために複雑さが増す可能性があります。おそらく、実行時にロードされたすべてのクラスを出力する-verbose:class JVM 引数を使用する方がよいでしょう。簡単にオフにでき、コンソールの出力を簡単にログにリダイレクトできます。
が見つからないため、実際には、 を取得している場合に見たいものではありCNFE
ません。さらに、利用可能なすべてのクラスが常にロードされるわけではありません。
このリストを確認することから始めます。しかし、一般的に、見つからない場合は、実際には見つかりません。
メモリ ダンプを作成し (jmap などを使用)、それを表示できます (jhat などを使用)。
あるいは、IIRC jconsole はロードされたクラスを表示できるので、それらを表示するだけで済みます。ただし、完全にはわかりません。現在、jconsole を実行していません。
3 番目の選択肢 (Java 5+ 用) は、Java6+ ディストリビューションの一部であるVisualVMです。
ただし、ほとんどの場合、jar ファイルがクラスパスにないか、カスタム クラスローダーを使用しています。そのjarをクラスパスに配置する方法について詳しく教えてください。