2011-10-27 9 views
3
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です。私の質問は、カスタムクラスローダーを使ってリソースバンドルをロードする方法です。ご協力いただきありがとうございます。カスタムクラスローダーを使用してリソースバンドルをロードしています

+0

あなたはどうやって自分のJarクラスローダを書いたのですか?あなたはすでにこれを行うことができます。 –

+0

何が尋ねられているか、実行されているか分かりません。 'getBundle'を呼び出すためのコードがもっと興味深いかもしれません。 'java.net.URLClassLoader.newInstance'を使うだけで、クラスローダを作成することができます。 –

答えて

4

findResource()/ findResources()メソッドをオーバーライドして実装する必要があります。これらのメソッドは、リソース・バンドル・プロパティー・ファイルおよびその他の非クラス・ファイルをロードするときに使用されます。

+0

それは魅力的に機能しました。完璧な修正、ありがとう。 –

+0

@WilliamCarey:これを答えとして受け入れてください! –

+1

これの補足として、私のためにこれを動作させるために、getResourceメソッドをオーバーライドしてから、その内部にsuper.findResourceを呼び出す必要がありましたが、クラスローダーがURLClassLoaderを拡張しています。 – Bucky24

関連する問題