1 package jp.sourceforge.stigmata.utils;
7 import java.io.ByteArrayOutputStream;
8 import java.io.IOException;
9 import java.io.InputStream;
11 import java.net.URLClassLoader;
12 import java.net.URLStreamHandlerFactory;
15 * ClassLoader for war file.
16 * A war file layouts classes in /WEB-INF/classes directory.
17 * Therefore, plain jar class loader cannot load classes included in war file.
18 * Because plain jar class loader only loads classes in top directory.
19 * Then, this class loader can load classes included in a plain jar file and a war file.
21 * @author Haruaki Tamada
24 public class WarClassLoader extends URLClassLoader{
25 public WarClassLoader(URL[] urls, ClassLoader parent, URLStreamHandlerFactory factory){
26 super(urls, parent, factory);
29 public WarClassLoader(URL[] urls, ClassLoader parent){
33 public WarClassLoader(URL[] urls){
38 protected Class<?> findClass(String name) throws ClassNotFoundException{
39 Class<?> clazz = null;
41 clazz = super.findClass(name);
42 } catch(ClassNotFoundException e){
43 String path = "WEB-INF/classes/" + name.replace('.', '/') + ".class";
44 for(URL url: getURLs()){
45 if(url.toString().endsWith(".war")){
47 URL newurl = new URL("jar:" + url + "!/" + path);
48 InputStream in = newurl.openStream();
49 ByteArrayOutputStream out = new ByteArrayOutputStream();
50 byte[] data = new byte[256];
52 while((read = in.read(data, 0, data.length)) != -1){
53 out.write(data, 0, read);
55 byte[] classdata = out.toByteArray();
59 clazz = defineClass(name, classdata, 0, classdata.length);
61 } catch(IOException exp){
67 throw new ClassNotFoundException(name);