この問題はそれほど単純ではありません。
外部のjarからクラスをロードすると、JVMに「ロード」されます。 JVMに「ロードする」とは、JVMがメモリ内のストレージを担当することを意味します。通常、それは次のように行われます。
ClassLoader myClassLoader = new MyClassLoader(jarFileContent);
Class myExtClass = myClassLoader.loadClass(myClassName);
リソースをクラスパスのjarファイルからは、これらのjarファイルがクラスパスにあるので、私は彼らの場所が知られている意味、
InputStream resourceStream = myClass.getResourceAsStream("/myFile.txt");
あなたはそれを行うことができますで簡単にアクセスすることができます。これらのファイルはメモリに保存されません。リソースにアクセスすると、JVMはクラスパスjar(ファイルシステムなど)でリソースを検索できます。
しかし、外部の瓶の場合、それは全く異なります。瓶はどこからも来ず、一旦処理されて忘れられます。 JVMはメモリからリソースをロードしません。これらのファイルにアクセスするには、手動でストレージを整理する必要があります。これを一度やったので、コードを共有することができます。基本的な考え方を理解するのに役立ちます(ただし、おそらくあなたの特定の図書館では役に立ちません)。
// Method from custom UrlClassLoader class.
// jarContent here is byte array of loaded jar file.
// important notes:
// resources can be accesed only with this custom class loader
// resource content is provided with the help of custom URLStreamHandler
@Override
protected URL findResource(String name) {
JarInputStream jarInputStream;
try {
jarInputStream = new JarInputStream(new ByteArrayInputStream(jarContent));
JarEntry jarEntry;
while (true) {
jarEntry = jarInputStream.getNextJarEntry();
if (jarEntry == null) {
break;
}
if (name.equals(jarEntry.getName())) {
final byte[] bytes = IOUtils.toByteArray(jarInputStream);
return new URL(null, "in-memory-bytes", new URLStreamHandler() {
@Override
protected URLConnection openConnection(URL u) throws IOException {
return new URLConnection(u) {
@Override
public void connect() throws IOException {
// nothing to do here
}
@Override
public InputStream getInputStream() throws IOException {
return new ByteArrayInputStream(bytes);
}
};
}
});
}
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
ここで、JARファイルはクラスパスに関連していますか? –
私はこの解決策についてはあまりよく分かりませんが、ABCがあなたのクラスならば、 そしてABC.class.getClassLoader.getResource()が助けになるかもしれません。 –
@TimBiegeleisenは、メインのメインアプリjarがビルドされたときに基本的に、他の外部ジャーはプラグインフォルダにあります。 –