社区
Web 开发
帖子详情
关于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
打赏
收藏
关于urlclassloader 关闭jar包问题
有一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包可被删除或修改。谢谢各位大虾!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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自带的管理页面更新程序
利用
URL
ClassLoader
读取
Jar包
并反射类(利用Tomcat源码)
背景:在公司内部项目中碰到了一个需求,我需要读取本地
jar包
然后反射其中的实体类来获取其类名、属性等字段并保存。 分析:显然,我们首先需要用到反射,但是反射需要有类加载器来加载类。比如
classLoader
.load(...
关闭
URL
ClassLoader
打开的
jar包
URL
ClassLoader
可以让开发者定义
classloader
,从jar文件或目录加载类文件。当
URL
Classloader
引用的是一 个jar文件时,用户是不能自己...这个web应用可以有自己的
jar包
,tomcat的也必须要打开这些
jar包
的。 tomcat的...
java通过
URL
ClassLoader
类加载器加载外部jar
本文主要讲如何动态调用外部jar,以及调用外部jar过程中可能遇到的
问题
。我们需要注意,外部jar内部依赖的jar,虽然在jar中,但是因为路径中包含了!/,并不能被访问到,所以需要将内部jar读出来,并写入本地。
【小技巧】-动态加载外部jar并执行方法
每次变更验证方法时,都让客户自己提供一个变更后的
jar包
,甲乙2方约定
jar包
中验证方法的类/方法/入参/出参,再通过页面上传的形式,上传
jar包
,后台通过反射的形式调用更新的
jar包
方法,达到动态更新线上环境验证...
JAVA动态加载或卸载
JAR包
我们经常会把一个模块的内容打包成一个FAT JAR,然后加载,实现模块的热加载,对于热加载的实现并不复杂,我们只需要定义自己的加载器,然后继承
URL
ClassLoader
就可以了,但是我们会发现一个
问题
,加载后的JAR 会被...
Web 开发
81,091
社区成员
341,719
社区内容
发帖
与我相关
我的任务
Web 开发
Java Web 开发
复制链接
扫一扫
分享
社区描述
Java Web 开发
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章