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