关于java动态加载jar的问题?

我做了一个java动态加载jar包的功能,我现在是不停止tomcat服务,而是停止调用jar包,然后我更新一下这个jar包,(注:此时这个jar的代码已经是改变过的,有新... 我做了一个java动态加载jar包的功能,我现在是不停止tomcat服务,而是停止调用jar包,然后我更新一下这个jar包,(注:此时这个jar的代码已经是改变过的,有新的功能),更新完我继续调用这个jar包的对象,但是,我动态加载过来的对象还是原先的那个对象,并没有我新加的功能,除非重新启动tomcat服务才可以,我现在不能想停止tomcat服务达到更新的效果,那个大哥会做啊?小弟在此先谢过了! 展开
 我来答
紫馨飛鴻
2014-03-20 · TA获得超过846个赞
知道小有建树答主
回答量:201
采纳率:100%
帮助的人:110万
展开全部
设我们有一个hello.jar文件,里面有一个Util类,我们希望在运行期调将这个jar包放入到我们运行环境并且调用里面的Util.getVersion方法。怎么实现?
在java中,我们的类都是通过ClassLoader来加载的,同时ClassLoader具有层级关系,当某个类找不到时,它会去他的父类加载器去寻找,如果依然找不到,就抛出ClassNotFoundException了。
为了动态加载hello.jar里面的Util类,我们需要将这个jar包放入到我们的类加载器中去,然后再获取里面的类。如下面的代码。

// 位于hello.jar
package com.flyingzl;

public class Util {

public static void getVersion(){

System.out.println("java version: " + System.getProperty("java.version"));
}

}

import java.io.File;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;

public class Main {
public static void main(String[] args) {

URL[] urls = new URL[] {};
MyClassLoader classLoader = new MyClassLoader(urls, null);

try {
classLoader.addJar(new File("c:/hello.jar").toURI().toURL());
Class<?> clazz = classLoader.loadClass("com.flyingzl.Util");
Method method = clazz.getDeclaredMethod("getVersion");
method.invoke(null);
classLoader.close();
} catch (Exception e) {
e.printStackTrace();
}

}

static class MyClassLoader extends URLClassLoader {

public MyClassLoader(URL[] urls) {
super(urls);
}

public MyClassLoader(URL[] urls, ClassLoader parent) {
super(urls, parent);
}

public void addJar(URL url) {
this.addURL(url);
}

}

}

注意:这里仅仅是为了展示如何动态加载jar包,代码写得很粗,生产代码需要有更完善的异常处理。我们只关心如何动态加载jar包即可。
动态加载jar包,需要用到java.net.URLClassLoader这个类,它可以指定一个路径将jar包或者classes文件加载到类空间。加载完毕后,直接调用loadClass就可以加载指定的类,然后通过反射生成实例或者调用方法即可。
其实,Tomcat等服务器也利用了此思路,比如每一个web应用启动时,它都会自动加载其下的lib文件夹下的jar包。
运行程序,我们就可以看到程序正常输出:
java version: 1.7.0_03
追问
非常感谢你!我能做到动态加载了,只是,当我在jar包中加入新的功能后打成jar包,然后替换掉旧的jar包,但是,程序加载的还是原先旧的jar包内容,我想问问这是怎么回事,我应该在哪里找问题的原因?谢谢您!
追答

查看附件,希望能够帮助你,字数多,百度提示字数限制,抱歉。

java开荒者
2014-03-20 · 超过14用户采纳过TA的回答
知道答主
回答量:118
采纳率:0%
帮助的人:29.1万
展开全部
好问题。好问题。好问题。好问题。
追问
你是来围观的吗?好问题,你到时回答一下啊
追答
恩,我也是想知道答案的人。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式