2

ここにはすでに似たような質問がたくさんあることは知っていますが、それらからよりスマートな質問を得ることができませんでした。jar ファイル内にクラスをロードしたいのですが、この時点では問題ありませんが、独自の ClassLoader にパスを渡すと、例外がスローされ、クラスが見つかりません。絶対パスを使用して jar 内にクラスをロードすることは可能ですか? 例えば、
Class cls = loader.loadClass(/path/MyPlugin.jar/MyPlugin.class);

しかし、私がこれを行うとき:

File test = new File("path/plugins/MyPlugin.jar/MyPlugin.class");
System.out.println(test.exists());

それはfalseを出力します。私はそれが何を意味するのかよくわかりませんが、ウェブで時々見たMyPlugin.jar!/MyPlugin.classorを使ってみました...MyPlugin.jar.jar!MyPlugin.class

これを行うと、クラスが見つかります:

URLClassLoader loader = new URLClassLoader(new URL[] { "path/plugins/MyPlugin.jar" });
Class cl = loader.loadClass("MyPlugin");

しかし、今、どうすればパスを受け取ることができますか? のようなものURL url = cl.getResource("MyPlugin");(nullを返す)

4

2 に答える 2

4

ClassLoader.getResourcesを使用して、クラスパス リソースへの URL を取得できます。特定のクラスの jar を見つけるには、次を使用できます。

URL url = classLoader.getResource("com/example/SomeClass.class");
JarURLConnection connection = (JarURLConnection) url.openConnection();
JarFile file = connection.getJarFile();
String jarPath = file.getName();

classLoaderロードしたいクラスを見つけることができるクラスローダーはどこにありますか。jar がアプリケーションのクラスパスの一部である場合は、システム クラスローダーを使用できます。

ClassLoader classLoader = ClassLoader.getSystemClassloader();

それ以外の場合は、事前に jar ファイルの場所を把握URLClassLoaderし、コンストラクターで jar を渡してのインスタンスを作成する必要があります。

ClassLoader classLoader = new URLClassLoader(new URL[]{new URL("path/to/the/jar/file.jar")});

それを使用してクラスをロードします。

于 2013-09-03T14:35:54.820 に答える