2011-10-27 81 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(); 

} 

} 

我有一個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