关于urlclassloader 关闭jar包问题

coffeenight 2011-07-05 12:33:02
有一web项目,使用tomcat作服务器,tomcat启动时,加载程序的servlet,servlet自动检查更新程序文件(jsp/jar等),删除原工程下web-inf/lib的jar包出现问题,删除不成功(因jar包被jvm加载打开):原xxx-1.0.jar,更新至xxx-1.1.jar,更新xxx-1.1.jar至lib后,删除原xxx-1.0.jar。
请问在程序中如何关闭jar包,使jar包可被删除或修改。谢谢各位大虾!
...全文
289 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
coffeenight 2011-07-14
  • 打赏
  • 举报
回复
无解...
coffeenight 2011-07-07
  • 打赏
  • 举报
回复
没人关注么?在网上GOOGLE了那么久,有一段能关闭urlclassloader的jar包代码,可以获取jar的handle,能执行jarfile.close,但是还是不能对已经close的jar文件进行删除修改操作。求正解....

Java代码
import java.io.File;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.jar.JarFile;

public class TestClassLoader {

public static void main(String[] args) throws Exception {
File jar = new File("d:\\test\\commons-lang-2.2.jar");
URL[] urls = new URL[]{jar.toURI().toURL()};
URLClassLoader loader = new URLClassLoader(urls);
Class<?> cls = loader.loadClass("org.apache.commons.lang.StringUtils");
System.out.println(cls.getName());

// 查找URLClassLoader中的ucp
Object ucpObj = null;
Field ucpField = URLClassLoader.class.getDeclaredField("ucp");
ucpField.setAccessible(true);
ucpObj = ucpField.get(loader);
URL[] list = loader.getURLs();
for(int i=0;i<list.length;i++){
// 获得ucp内部的jarLoader
Method m = ucpObj.getClass().getDeclaredMethod("getLoader", int.class);
m.setAccessible(true);
Object jarLoader = m.invoke(ucpObj, i);
String clsName = jarLoader.getClass().getName();
if(clsName.indexOf("JarLoader")!=-1){
m = jarLoader.getClass().getDeclaredMethod("ensureOpen");
m.setAccessible(true);
m.invoke(jarLoader);
m = jarLoader.getClass().getDeclaredMethod("getJarFile");
m.setAccessible(true);
JarFile jf = (JarFile)m.invoke(jarLoader);
// 释放jarLoader中的jar文件
jf.close();
System.out.println("release jar: "+jf.getName());
}
}
}
}
原文出处:http://weifly.iteye.com/blog/941730
coffeenight 2011-07-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 stevenzxl 的回复:]

没明白你的问题~你是想用程序去控制更新一个jar包然后再把原先的删除是这样吗?
貌似是不可以的,因为tomcat启动以后它会把所有的jar包都引入进来。
你试试先删除然后在更新,这样貌似比较合理。
或者你可以写一个xml文件用run as ant
[/Quote]

对,程序更新jar包,把旧版本的jar包删除;这是一个自动更新程序,在客户那边使用。这里涉及更新的内容比较多,有jsp,jar,脚本文件等。详细记录更新的过程。
stevenzxl 2011-07-05
  • 打赏
  • 举报
回复
没明白你的问题~你是想用程序去控制更新一个jar包然后再把原先的删除是这样吗?
貌似是不可以的,因为tomcat启动以后它会把所有的jar包都引入进来。
你试试先删除然后在更新,这样貌似比较合理。
或者你可以写一个xml文件用run as ant
xxy8100 2011-07-05
  • 打赏
  • 举报
回复
这个是tomcat自动加载的,启动jar被加载占用了, 你可以用tomcat自带的管理页面更新程序

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧