weblogic 10.3 如何配置热部署 急!!

来源:互联网 发布:软件行为分析 编辑:程序博客网 时间:2024/06/05 10:59
要实现热部署,就必须自定义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!

原创粉丝点击