新加一个jar还好办,可以用URLClassLoader,如果替换的话就要重写一个ClassLoader了,不过如果替换的话一般的手法还真没什么着,最好参考一下JBoss的Hot Deploy的实现

解决方案 »

  1.   

    搞明白了,就用URLClassLoader;当jar文件更新时,先把原来已经new出来的对象置为null,然后用一个新的URLClassLoader装进来。
      

  2.   

    ofbiz上的东东:
    package org.ofbiz.base.start;import java.io.File;
    import java.io.IOException;
    import java.net.MalformedURLException;
    import java.net.URL;
    import java.net.URLClassLoader;
    import java.util.StringTokenizer;
    import java.util.Vector;/**
     * Class to handle CLASSPATH construction
     * @author Jan Hlavat?
     */
    public class Classpath {    Vector _elements = new Vector();    public Classpath() {}    public Classpath(String initial) {
            addClasspath(initial);
        }    public boolean addComponent(String component) {
            if ((component != null) && (component.length() > 0)) {
                try {
                    File f = new File(component);
                    if (f.exists()) {
                        File key = f.getCanonicalFile();
                        if (!_elements.contains(key)) {
                            _elements.add(key);
                            return true;
                        }
                    }
                } catch (IOException e) {}
            }
            return false;
        }    public boolean addComponent(File component) {
            if (component != null) {
                try {
                    if (component.exists()) {
                        File key = component.getCanonicalFile();
                        if (!_elements.contains(key)) {
                            _elements.add(key);
                            return true;
                        }
                    }
                } catch (IOException e) {}
            }
            return false;
        }    public boolean addClasspath(String s) {
            boolean added = false;
            if (s != null) {
                StringTokenizer t = new StringTokenizer(s, File.pathSeparator);
                while (t.hasMoreTokens()) {
                    added |= addComponent(t.nextToken());
                }
            }
            return added;
        }    public String toString() {
            StringBuffer cp = new StringBuffer(1024);
            int cnt = _elements.size();
            if (cnt >= 1) {
                cp.append(((File) (_elements.elementAt(0))).getPath());
            }
            for (int i = 1; i < cnt; i++) {
                cp.append(File.pathSeparatorChar);
                cp.append(((File) (_elements.elementAt(i))).getPath());
            }
            return cp.toString();
        }    public URL[] getUrls() {
            int cnt = _elements.size();
            URL[] urls = new URL[cnt];
            for (int i = 0; i < cnt; i++) {
                try {
                    urls[i] = ((File) (_elements.elementAt(i))).toURL();
                } catch (MalformedURLException e) {}
            }
            return urls;
        }    public ClassLoader getClassLoader() {
            URL[] urls = getUrls();        ClassLoader parent = Thread.currentThread().getContextClassLoader();
            if (parent == null) {
                parent = Classpath.class.getClassLoader();
            }
            if (parent == null) {
                parent = ClassLoader.getSystemClassLoader();
            }
            return new URLClassLoader(urls, parent);
        }
    }
    改变的代码如下:
     private Classpath classPath = new Classpath(System.getProperty("java.class.path"));   
           System.setProperty("java.class.path", classPath.toString());        
            ClassLoader classloader = classPath.getClassLoader();
            Thread.currentThread().setContextClassLoader(classloader);
    主要是通过ClassLoader来完成应该可以满足你的要求。
      

  3.   

    URLClassLoader就可以了
    根本不需要这么复杂的