0 0

类加载器URLClassLoader.loadClass(className)后, 无法卸载Jar5

近两天遇到一个棘手的问题

在开发一件java插件应用时,需求通过URLClassLoader.addURL("file:/C:/developer/plugins/admin/lib/MyClassName.jar");
加载jar文件,加载MyClassName.jar后是可以重名的;
但再执行Class class = URLClassLoader.loadClass("package.MyClassName")后,jvm内存也就正式加载了MyClassName.jar文件了,此时文件无法重名了,将class = null;也无法对MyClassName.jar重名;除非将整个应该停止下来才可以文件重名;

问题在于不能直接调用类卸载jvm内存的jar,那我就无法更新插件了@@@@

请问有什么方法可以将MyClassName.jar文件在jvm内存里卸载下来的?
问题补充:
有人知道tomcat中的manager管理应用是如何将servlet停止,增加,删除的?
问题补充:
要是manager将jvm down了,那么其它的应用也会不能正常运行啦!
问题补充:
manager这个东东好像运行再一个"client" VM中;
您认为的是好像,实际上manager并不是运行再一个"client" VM中
不信您测试一下manaer的源代码@
问题补充:
非常感谢aidiyuxin给出回答!

可是目前问题没有解决到这个问,希望能找到一个好的方法可以解决已运行的java能够实现自动更新的功能呢!注(对已加载的jar实现更新:不重启jvm的情况下)


问题补充:
问题基本可以解决,但不完善!
(还是不能删除已addURL过的jar文件)
可以先将lib里面的jar排序,然后再重新载入jar即可@
2008年9月12日 08:51

9个答案 按时间排序 按投票排序

0 0

我最近也遇到了这个问题,我的两个jar路径是不同的,但是两个jar包里面的入口类,包名和类名都是一样的
1.这两个jar的id为pluginID,这两个pluginID是不同的。
2.我用Map<String, URLClassLoader> 将URLClassLoader 缓存起来,
3.已经加载的URLClassLoader只从map里面获取,没有加载的重新加载。
4.这样应该可以解决:包名和类名都重复的问题,因为只要不是使用同一个URLClassLoader 去加载jar,应该就不会有问题。

pluginID为插件的id

部分代码如下:

URLClassLoader classLoader = null;
if (classLoaders.containsKey(pluginID)) {
classLoader = classLoaders.get(pluginID);
} else {
classLoader = new URLClassLoader(new URL[] { url }, Thread
.currentThread().getContextClassLoader());

classLoaders.put(pluginID, classLoader);
}

2016年8月01日 21:24
0 0

引用
这个文章里说的reload不透明是指什么?为什么classloader不能reach到就能保证透明了?


reload不透明是指什么?晕,他们貌似号称reload是透明的啊
它的意思说,java对于reload问题不支持
如果要reload的话必须保证你reload的东西是完全无关的,没有任何引用
sun觉得这样情况非常非常的稀少,所以这部分就透明了
不需程序员来做,全部由System。gc();
这就是reload的透明性

2008年9月17日 09:24
0 0

http://java.sun.com/docs/books/jls/unloading-rationale.html
这个文章里说的reload不透明是指什么?为什么classloader不能reach到就能保证透明了?

2008年9月16日 18:59
0 0

楼主
这个篇文章是sun对java卸载class,或者reload的态度
http://java.sun.com/docs/books/jls/unloading-rationale.html

呵呵。。。你可以看看,要不就自己写个classLoader吧,大公司都是这么做地
你可以尝试下。。。

2008年9月16日 09:49
0 0

呵呵,小弟也是菜鸟一个
大家一起讨论下咯
不知道楼主了解java.rmi.Naming不
这个类里面有个
rebind(String name, Remote obj)
方法
你看下是不是可以解决你的问题
如果不可以,你就要写自己的classLoader了
在写的时候预留一个类重启的功能。。。
在别的东西我也就不知道了
o(∩_∩)o

2008年9月16日 09:34
0 0

呵呵,咱们朋友称呼吧
是这么回事的,tomcat这样的东西下面跑了很多jvm的
不只是一个
我上面所说的clientVM,serverVM也不是专业数据,Java中的clientVM和serverVM的区别是client启动快,但是运行时间长了就会慢,server相反

所以说的server和client不是只标准的server和client

因为class被加载到jvm中时会自动加上final所以会出现不能加载包名,类名完全相同的class
但是tomcat下,不同项目之间是可以出现重名的,这因为他用的是自己的classLoader

所以manager这个东西不要管他了,如果你要实现你说的功能,不妨自己试试写个loader,我以前写了一个,但是中间去做别的事了,没有写完,所以这方面我也没什么发言权

&#9825

2008年9月12日 11:34
0 0

tomcat中好像是用Xbootclasspath
这个东西加载jar的
而且用的是"client" VM和"server" VM这种形式运行的
manager这个东东好像运行再一个"client" VM中,clientVM的从其与否,不会影响到serverVM的

2008年9月12日 09:58
0 0

那不就是吧jvm  down掉之后再运行的嘛~

2008年9月12日 09:36
0 0

貌似不能的
你吧类加载到了jvm中,就不能去掉了
除非从新加载

2008年9月12日 09:09

相关推荐

    使用URLClassLoader加载本地文件夹c盘下的test.jar文件

    URLClassLoader是Java提供的一种类加载器,它允许我们通过URL来加载类和资源,从而实现这一目标。本篇文章将深入讲解如何使用URLClassLoader加载C盘下的test.jar文件。 首先,了解类加载器的基本概念。在Java中,类...

    Java URLClassLoader动态加载jar包1

    然后,使用`Class.forName()`方法,指定了要加载的类全名(包括包名)"org.javaweb.url.Url",并传入`URLClassLoader`实例作为上下文类加载器,这样就可以确保这个类是由这个特定的`URLClassLoader`加载的。...

    aop面向切面需要的jar包

    在使用spring的aop功能时,这两个jar是必须的,否则会报错,如下: Caused by: java.lang.ClassNotFoundException: org.aspectj.weaver.reflect.ReflectionWorld$ReflectionWorldException at java.net....

    jdbc--sqljdbc4-2.0.jar

    java链接sqlserver数据库包如下错误时: ... at java.net.URLClassLoader.findClass(Unknown ... at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Unknown Source) 添加sqljdbc4-2.0包即可

    resolver_java_wsdl.jar

    java发布wsdl部署到was 8.5报错的时候引入的jar包,比如如下情况: Caused by: java.lang.NoClassDefFoundError: com.sun.org.apache.xml.internal.resolver.CatalogManager at ...

    URLClassLoader初体验

    在Java中,类的加载遵循双亲委派模型,`URLClassLoader`会首先尝试在其父类加载器(通常是`BootstrapClassLoader`或`ExtensionClassLoader`)无法找到指定类时进行加载。 在创建`URLClassLoader`实例时,需要提供一...

    jaxen.jar和dom4j.jar

    java.lang.NoClassDefFoundError: org/jaxen/JaxenException ... at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) at java.lang.ClassLoader.loadClass(Unknown Source) ... 27 more

    AXMLPrinter2、baksmali、smali、dex2jar

    4、使用dex2jar-0.0.7.9-SNAPSHOT将classes.dex反编译成xxx.class文件 将classes.dex拷贝至dex2jar-0.0.7.9-SNAPSHOT,cmd进入目录,使用如下命令即可 dex2jar classes.dex 如果出现如下错误: Exception in thread...

    swing-worker-1.1.jar

    at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at sun.misc.Launcher$ExtClassLoader.findClass(Launcher.java:229) at java.lang.ClassLoader.loadClass(ClassLoader.java:307) at java.lang...

    URLClassLoader中指定目录和jar的问题

    - 当`loadClass`方法被调用时,`URLClassLoader`会遍历其URL列表,查找指定类的`.class`文件。 3. **指定目录加载**: - 目录URL(如`file:/path/to/directory/`)用于加载目录下的类文件。类加载器会递归遍历...

    android反编译dex2jar

    今天用dex2jar.bat反编译apk的classes.dex文件的时候报了以下错误: ---------------------------------------------------------------------------- 描述错误: ECHO 处于关闭状态。 Exception in thread "main" ...

    Java类加载器(ClassLoader)1

    - 负责加载Java核心库,如rt.jar、resources.jar以及sun.boot.class.path路径下的类。 - 不继承自java.lang.ClassLoader,没有父加载器。 - 它仅加载以java、javax、sun等开头的基础包类。 2. 扩展类加载器...

    反射获取jar文件中的类

    这个方法使用了 JarFile 和 JarEntry 来获取 jar 文件中的所有类,然后使用 URLClassLoader.loadClass 方法加载类,并使用 getMethods 方法获取类中的方法。 反射的应用 反射机制有很多应用,例如: * 动态代理:...

    解决classloader的jar包

    包括commons-logging commons-beanutils commons-lang ezmorph json-lib-2.4-jdk15 commons-collections-3.2.1的jar包,可以解决 org/apache/commons/lang/exception/NestableRuntimeException的问题

    ClassLoaderTest:测试如何正确关闭类加载器,以便可以关闭基础jar文件上的文件句柄

    关闭类加载器的一个常见问题是,当我们动态加载了jar文件中的类后,jar文件会被一个JarFile对象打开,这个对象持有对文件的句柄。如果不正确关闭,这个句柄将持续占用,导致资源泄漏。因此,我们需要在适当的时候...

    Java 自动加载JAR文件并运行其中的类方法

    3. **加载类**:使用加载的类加载器,我们可以加载JAR中的类。例如,如果我们知道类名为`com.example.MyClass`,我们可以这样加载: ```java String className = "com.example.MyClass"; Class&lt;?&gt; clazz = ...

    动态加载类机制JAVA

    - 自定义类加载器:开发者可以创建自己的类加载器子类,覆盖`loadClass()`方法,实现自定义的类查找和加载逻辑。 2. 双亲委派模型(Parent Delegation Model): - Java的类加载机制遵循双亲委派模型,即当一个类...

    dynamic-load-class-parent.zip

    1. **类加载器(ClassLoader)**: 类加载器是Java虚拟机(JVM)的一部分,负责将.class文件加载到内存中并转化为Class对象。Java提供了一种层次结构的类加载机制,其中Bootstrap ClassLoader、Extension ClassLoader和...

    Java虚拟机JVM类加载初始化

    - 压缩文件加载:从`.jar`、`.zip`等压缩文件中查找并加载类,自动解析`.jar`文件中的`.class`文件。 - 动态编译:从`.java`源代码文件编译成`.class`文件,然后加载。 类加载器的层次结构包括引导类加载器...

    jvm 加载class文件

    Java程序的运行依赖于类加载器将`.class`文件加载到JVM中,并对其进行验证、准备和解析等步骤,最终使类能够在JVM中执行。 #### 三、Class文件的加载过程 Java类的加载过程主要可以分为以下几个阶段: 1. **加载...

Global site tag (gtag.js) - Google Analytics