求教:
如何才能在程序运行时才加载JAR?
如我的程序目录下有个lib文件专门用来放JAR文件,在运行前时并不知道要加载什么JAR,在程序后,才指定JAR的名称,在加载这个JAR;
一个典型的例子:
我的程序要链接到数据库,但并不清楚要链接到那个数据库,使用什么JDBC驱动,可以将要加载的JDBC驱动拷贝到lib文件夹下,然后运行程序,在程序中指定使用这个JDBC的url和驱动字符串等等信息,来加载这个JDBC,这样就可以灵活的选择要连接到的数据库了。

解决方案 »

  1.   

    import java.io.File;
    import java.lang.reflect.Method;
    import java.net.URL;
    import java.net.URLClassLoader;import javax.swing.JFileChooser;
    import javax.swing.JOptionPane;
    import javax.swing.filechooser.FileFilter;public class DynamicLoadTest {
    public static void main(String[] args) throws Exception 
    {
    JFileChooser jarFileChooser = new JFileChooser();
    FileFilter ff = new FileFilter() {
    public boolean accept(File f)
    {
    if (f.isDirectory() ||
    f.getName().endsWith(".jar") || 
    f.getName().endsWith(".zip")) {
    return true;
    }
    return false;
    } public String getDescription()
    {
    return "jar文件或者zip文件, 可以多选";
    }

    };
    jarFileChooser.setFileFilter(ff);
    jarFileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
    jarFileChooser.setMultiSelectionEnabled(true);
    int r = jarFileChooser.showOpenDialog(null);
    if (r != JFileChooser.APPROVE_OPTION) {
    System.exit(0);
    }

    String className = JOptionPane.showInputDialog(null, 
    "输入包含main方法的类的完整名称, 例如 com.abc.MainClass");
    if (className == null) {
    System.exit(0);
    } String paramStr = JOptionPane.showInputDialog(null, "输入参数");
    String[] params = paramStr == null ? new String[0] : paramStr.split(" "); File[] jarFiles = jarFileChooser.getSelectedFiles();
    URL[] jarFileUrls = new URL[jarFiles.length];
    for (int i = 0; i < jarFileUrls.length; i++) {
    jarFileUrls[i] = jarFiles[i].toURL();
    } URLClassLoader classLoader = 
    new URLClassLoader(jarFileUrls, DynamicLoadTest.class.getClassLoader());  //***
    Class mainClass = Class.forName(className, true, classLoader);
    Method mainMethod = mainClass.getMethod("main", new Class[] {String[].class});
    mainMethod.invoke(null, new Object[] {params});
    }
    }