import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
public class JarClassLoader extends ClassLoader {
private String path;
public JarClassLoader(String path) {
this.path = path;
}
@Override
public Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException
{
Class<?> c = findLoadedClass(name);
if (c == null) {
try {
c = findSystemClass(name);
} catch (Exception e) {
}
if (c != null)
return c;
try {
byte data[] = loadClassData(name);
c = defineClass(name, data, 0, data.length);
if (c == null)
throw new ClassNotFoundException(name);
if (resolve)
resolveClass(c);
} catch (Exception e) {
e.printStackTrace();
}
}
return c;
}
private byte[] loadClassData (String classEntry) throws IOException {
System.out.println(classEntry);
String filename = classEntry.replace('.', File.separatorChar) + ".class";
JarFile jar = new JarFile(path);
JarEntry entry = jar.getJarEntry(filename);
InputStream is = jar.getInputStream(entry);
int data;
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
while ((data = is.read()) != -1) {
byteStream.write(data);
}
return byteStream.toByteArray();
}
}
私は、必要なすべてのクラスファイルをjarファイルから読み込むためのClassLoaderを持っています。これにはMySQLのjavaドライバファイルも含まれています。これらのファイルをロードしようとすると、com.mysql.jdbc.LocalizedErrorMessagesにエラーが発生します。これはResourceBundleです。私の質問は、カスタムクラスローダーを使ってリソースバンドルをロードする方法です。ご協力いただきありがとうございます。カスタムクラスローダーを使用してリソースバンドルをロードしています
あなたはどうやって自分のJarクラスローダを書いたのですか?あなたはすでにこれを行うことができます。 –
何が尋ねられているか、実行されているか分かりません。 'getBundle'を呼び出すためのコードがもっと興味深いかもしれません。 'java.net.URLClassLoader.newInstance'を使うだけで、クラスローダを作成することができます。 –