Java动态加载jar

通常应用程序都会有很多依赖包,通常的做法是写脚本,在脚本中把依赖包添加到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();
        }
    }
}

 

 

posted @ 2010-02-11 16:21  Rookie.Zhang  阅读(2029)  评论(0)    收藏  举报