WebLogic10.3 如何设置热部署?

来源:互联网 发布:那曲网络怎么样 编辑:程序博客网 时间:2024/05/18 00:54
eclipse + WebLogic10.3 ,但是每改一个Java文件,就会自动重新发布,
请问,如何设置才能让它不自动发布呢?
WebLogic是10.3

谢谢大家了。




要实现热部署,就必须自定义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,加载需要加载的类。



原创粉丝点击