要实现热部署,就必须自定义ClassLoader,当类被修改过后,加载该类。下面通过代码说明: package classloader; /** * @author vma */ // 自定义一个类加载器 public class DynamicClassLoader extends ClassLoader { public Class<?> findClass(byte[] b) throws ClassNotFoundException { return defineClass(null, b, 0, b.length); } package classloader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; /** * @author vma */ public class ManageClassLoader { DynamicClassLoader dc =null; Long lastModified = 0l; Class c = null; //加载类, 如果类文件修改过加载,如果没有修改,返回当前的 public Class loadClass(String name) throws ClassNotFoundException, IOException{ if (isClassModified(name)){ dc = new DynamicClassLoader(); return c = dc.findClass(getBytes(name)); } return c; } //判断是否被修改过 private boolean isClassModified(String filename) { boolean returnValue = false; File file = new File(filename); if (file.lastModified() > lastModified) { returnValue = true; } return returnValue; } // 从本地读取文件 private byte[] getBytes(String filename) throws IOException { File file = new File(filename); long len = file.length(); lastModified = file.lastModified(); byte raw[] = new byte[(int) len]; FileInputStream fin = new FileInputStream(file); int r = fin.read(raw); if (r != len) { throw new IOException("Can't read all, " + r + " != " + len); } fin.close(); return raw; } } 测试类;Main 每隔 5s 加载一次 package classloader; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * * @author vma */ public class Main { /** * @param args the command line arguments */ public static void main(String[] args) throws ClassNotFoundException, IOException, NoSuchMethodException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, InstantiationException, InterruptedException { String path = "D:\\deploy\\JDBC\\ClassLoader\\build\\classes\\classloader\\LocalClass.class"; ManageClassLoader mc = new ManageClassLoader(); while(true){ Class c = mc.loadClass(path); Object o = c.newInstance(); Method m = c.getMethod("getName"); m.invoke(o); System.out.println(c.getClassLoader()); Thread.sleep(5000); } } 被加载的类 /** * * @author vma */ public class LocalClass { public void getName() { System.out.println("hahaha "); } } 运行时,每隔5s 输出: hahaha classloader.DynamicClassLoader@61de33 当我们修改 System.out.println("hahaha "); ---> System.out.println("changed "); 编译LocalClass后 输出变为: changed classloader.DynamicClassLoader@173a10f 在loadClass中, 我们必须重新初始化一个ClassLoader,负责就会违背同一个ClassLoader是不允许多次加载一个类的。 public Class loadClass(String name) throws ClassNotFoundException, IOException{ if (isClassModified(name)){ dc = new DynamicClassLoader(); return c = dc.findClass(getBytes(name)); } return c; } 当然,容器的实现机制肯定及其完善,不可能周期性的加载,可能回通过监听机制,动态加载修改过的类。但它的实现机制肯定也是重新 实例化一个ClassLoder,加载需要加载的类。
==========================================================================
另一回答:
在你的webapp下有一个WEB-INF,其下有一个weblogic.xml,该文件内有一个<jsp-descriptor>元素,该元素下有一个<jsp-param>的名称<param-name>为debug的元素,将其值<param-value>设置为true。good luck!