URLClassLoader可以让开发者定义classloader,从jar文件或目录加载类文件。当URLClassloader引用的是一个jar文件时,用户是不能自己关闭这个被打开的jar文件的,有时候这真是一个大问题。tomcat中可以动态的删除一个web应用,那他是怎么关闭打开的jar文件呢?这个web应用可以有自己的jar包,tomcat的也必须要打开这些jar包的。
tomcat的webClassLoader自己来管理这些被打开的jar文件,并在classloader中提供了closeJars方法,这样做真的是很明智的。jetty服务器中的WebAppClassLoader没有tomcat中的classLoader那么智能,他们真的需要改进一下。
下面的类也可以达到关闭jar文件的功能,他通过java中反射机制强行的关闭被打开的JarFile文件,但是这么做的话就依赖于jdk中的URLClassLoader的实现了,对于IBM或WEBLogic中的jdk可能不能运行。
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());
}
}
}
}
分享到:
相关推荐
然后,使用`Class.forName()`方法,指定了要加载的类全名(包括包名)"org.javaweb.url.Url",并传入`URLClassLoader`实例作为上下文类加载器,这样就可以确保这个类是由这个特定的`URLClassLoader`加载的。...
本篇文章将深入讲解如何使用URLClassLoader加载C盘下的test.jar文件。 首先,了解类加载器的基本概念。在Java中,类加载器是负责查找并加载类的机制。Java虚拟机(JVM)使用一系列的类加载器,包括Bootstrap ...
包括commons-logging commons-beanutils commons-lang ezmorph json-lib-2.4-jdk15 commons-collections-3.2.1的jar包,可以解决 org/apache/commons/lang/exception/NestableRuntimeException的问题
- JAR文件内部的类加载同样遵循包结构,`URLClassLoader`会解析JAR的`META-INF/MANIFEST.MF`文件,如果存在`Class-Path`属性,还会加载指定的其他JAR。 5. **动态添加URL**: - 由于`URLClassLoader`的`addURL`...
本文将详细介绍如何在Eclipse中将项目打包成JAR文件,并确保能正确引用外部JAR包和读取外部配置文件。 首先,我们来看如何打包项目为JAR。在Eclipse中,选择`Export` -> `Java` -> `Runnable JAR file`。在弹出的...
2. 使用URLClassLoader:通过URL数组指定jar的路径,每个URL代表一个jar,可以控制不同版本的jar包加载顺序。 3. 配置管理:创建配置文件,记录各个模块所依赖的jar包版本,根据配置动态加载对应的jar包。 4. 使用...
常见的工具有JD-GUI,它是一个图形界面工具,可以直接打开jar包或class文件,显示源代码视图。 三、JD-GUI的使用 1. 安装与启动:JD-GUI是一个独立的工具,可以从官方网站下载安装。启动后,通过菜单或拖放方式可以...
在这个场景中,我们看到一个基于Springboot的应用程序结合了Hutool-db库,利用URLClassLoader来实现动态加载外部数据库驱动和数据池的jar包。这使得开发者可以在不重启应用的情况下更新或添加新的数据库连接和资源池...
Spring bean 一般通过配置文件和注解进行加载,如果要实现jar或class文件,动态实现spring bean 的动态加载,并通过UrlClassLoader完成jar和class文件的加载。可以实现jar的热替换。spring的bean动态加载则需要对...
在本资源中,"structure开发"可能是指一种特定的软件架构或开发框架,它被封装在一个JAR包内,供开发者在构建应用程序时使用。 1. **Java JAR 文件**: JAR文件是Java平台的核心组成部分,它允许将多个类文件、资源...
在Java编程中,有时我们需要在运行时从JAR(Java ...通过以上步骤,你可以在Java源文件中成功地读取并处理JAR包文件中的内容。记住,这只是一个基础的实现,根据具体需求,你可能需要添加更多的错误处理和优化措施。
在处理外部jar包时,我们可能需要从文件系统或网络读取类的`.class`文件,这可以通过`URLClassLoader`的子类实现,它提供了方便的方法来加载基于URL的类。 以下是一个简单的自定义ClassLoader示例,它能从指定的jar...
在标题和描述中提到的"ofdrw .ofd 转 .pdf 所需要的jar包,不是maven项目的看过来.rar",这表明这个压缩包包含了一组Java库(jar包),用于非Maven项目中将OFD文件转换为PDF。 首先,我们需要理解什么是OFD和PDF。...
"解析apk的jar包"就是这样一个工具,它可以帮助我们提取和查看APK中的重要信息,比如版本号、版本名以及包名等。 首先,我们要了解APK的结构。一个标准的APK文件实际上是一个ZIP格式的压缩包,里面包含了DEX...
在使用spring的aop功能时,这两个jar是必须的,否则会报错,如下: Caused by: java.lang.ClassNotFoundException: org.aspectj.weaver.reflect.ReflectionWorld$ReflectionWorldException at java.net....
URLClassLoader是一个专门用于加载外部jar包的类加载器,它可以从外部jar包中加载类文件。我们可以使用URLClassLoader来加载外部jar包,然后将其添加到classpath中。 下面是一个使用URLClassLoader加载外部jar包的...
"我的平台使用的jar包2"可能指的是这个平台依赖的一个关键组件,可能是用于提供特定功能或者服务的库。 在Java开发中,JAR文件扮演着至关重要的角色。它们是程序的可执行部分,通常包含了类、接口、元数据和资源...
### Spring Boot 动态加载 Jar 包到容器中并映射为接口的技术解析 #### 一、背景介绍 在实际的开发过程中,我们经常会遇到这样的需求:系统需要根据不同的业务场景来动态地加载不同的功能模块或者组件。这些功能...
`classpath*:`不仅会查找类路径下的指定资源,还会递归地查找所有jar包和目录下的匹配文件。这意味着如果你有多个相同命名的配置文件分别存在于不同的jar包中,`classpath*:`会找到所有这些文件。 4. **Spring的...
jar包是Java应用程序的可执行格式,它包含编译后的类文件和其他资源,使得开发者可以方便地分发和运行Java程序。 在提供的压缩文件"JAVAxmqcsljar"中,我们很可能找到了与本书案例相关的jar包资源。这个jar包可能是...