通常应用程序都会有很多依赖包,通常的做法是写脚本,在脚本中把依赖包添加到classpath,然后启动主程序。所以本篇纯属调侃,如何在java程序中实现动态加载一个jar,而之后可以自由的使用jar中的类。 比如我们有个demo.Person类
package demo;
public class Person { private int age; private String name;
public Person() { } public Person(String name, int age) { this.age = age; this.name = name; } public int getAge() { return this.age; } public void setAge(int age) { this.age = age; }
public String getName() { return this.name; } public void setName(String name) { this.name = name; }
public String toString() { return "Person{name: " + this.name + ", age: " + this.age + "}"; } }
我们把demo.Person编译后打包到person.jar,比如放在E:\training\person.jar 然后我们在调用的主程序中可以通过如下代码动态加载person.jar:
import demo.Person; import java.io.File; import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoader;
/** * 这里演示动态加载一个jar的方法 * 其中 demo.Person 类打包在 E:/Training/person.jar * 执行的时候只需要在Demo的当前路径执行 java Demo就可以自动装载person.jar */ public class Demo { public static void main(String[] args) { try { // 包路径定义 URL urls[] = new URL[ ]{ new File("E:/Training/person.jar").toURL() };
// 获取类装载器,然后用反射方式调用类加载器的addURL方法,把新的jar路径添加进去 URLClassLoader urlLoader = (URLClassLoader) ClassLoader.getSystemClassLoader(); Class sysclass = URLClassLoader.class; Method method = sysclass.getDeclaredMethod("addURL", new Class[]{URL.class}); method.setAccessible(true); method.invoke(urlLoader, urls); Person p = new Person("Kyle.Zhang", 33); System.out.println(p); } catch (Exception exp) { exp.printStackTrace(); } } }
程序运行当前路径和分隔符可以这样取得: String curDir = System.getProperty("user.dir"); String separator = System.getProperty("file.separator");
|