方案思想
自定义CustomClassLoader,彻底改变classloader的加载方式,自己管理class缓存以及配置文件重定向。根据自定义的加载规则控制3rd jar和配置加载。
CustomClassLoader是自定义的classloader, 修改了java的默认委托规则,任何情况优先加载指定的jar,其父加载器是SystemClassLoader.
相对方案一
可以指定系统中的具体模块按照指定的classloader方式加载,自定义的classloader相对较少,而且配置相对灵活很多。只是对系统的侵入性较方案一高。
启动初始化
加载特定配置文件,对于需要按此方式加载的module,也就是配置了bundle模式,初始化对应的CustomClassLoader,如果没有则不加载,和默认方式完全一样。
目录说明
workspace指的module专属的class资源路径,即专属命名空间。
libs指的module专属的必须第三方jar资源路径。
configuration指的module专属的配置文件路径。
加载规则
对于加载class
1.CustomClassLoader先从当前自定义缓存加载。(findLoadedClassFromCache)
2.如果缓存内不存在,则从系统class cache加载。(findLoadedClass)
3.如果系统class cache内不存在,则从指定的workspace(本地/远程)目录加载。(findResourceInternal)
4.如果workspace内不存在,则从指定的libs(本地/远程)目录加载。(findResourceInternal)
5.如果libs内不存在,则委托给systemclassloader加载。(parentClassLoader.loader)
对于加载resource
1.CustomerClassLoader先从当前自定义缓存加载。(findLoadedClassFromCache)
2.如果缓存内不存在,则从指定的configuration目录(本地/远程)中加载。(findResourceInternal)
3.如果configuration内不存在,则从指定的libs(本地/远程)目录加载。(findResourceInternal)
4.如果libs内不存在,则委托给systemclassloader加载。(parentClassLoader.loader)
配置部署
当需要调用的有资源冲突模块时,将当前的Thread的contextClassloader修改为CustomClassLoader,并通过反射执行调用逻辑,最后将contextClassloader修改为调用前的ClassLoader.
加速访问
针对加载规则,可以发现,如果出现大量的无法加载的class或者resource,则步骤3内jar文件的IO操作会非常多,如果持续持有jar文件句柄,一则句柄占用,二则jar无法热部署。因此可以用一个设定阀值的LinkedHashMap作为访问libs的前置。
1. 如果一个class经过步骤1-3均无法加载,则将其name放到这个LinkedHashMap。
2. 在步骤3访问libs之前,先判断下LinkedHashMap 是否有这个,如果存在则直接抛ClassNotFoundException.
3. LinkedHashMap达到阀值后会自动清除最先放入的class name.
热部署
java没有自带的文件钩子(也可参考http://flypig.iteye.com/blog/870423实现),可采用对所有modules的workspace,libs,configuration三目录扫描,来查看文件系统是否有变化。
1.如果有变化,则reload相应的module资源,其实就是清除class和resource缓存,还有引用到的static,final等变量,ThreadLocal变量,ExecutorService相关变量等,然后new一个新的CustomClassLoader,原先的等待GC,全部释放相关引用肯定可以GC的。
2.考虑到libs内的jar也需要热部署,因此可采取每个module的lib目录内所有jar运行期间惰性加载,保持一定的时间(计时器)或者一定的加载次数(计数器)后,关闭jar引用,需要加载时再打开即可。不管是计时还是计数,这个统计结算逻辑都可以放到文件扫描的那个后台线程去做。
- 大小: 6.4 KB
- 大小: 15.6 KB
分享到:
相关推荐
在tomcat下部署成功,迁移到weblogic下,报错,一般都是配置和jar包问题,配置问题开发根据报错能解决,jar冲突比较烦人,这里给出了解决方案。
在websphere8.5 下部署含有CXFwebservice的war包无法正常启动,...归根结底原因不是找不到类,而是发布后war下的jar与websphere自身平台下的jar冲突了,要解决此问题就要通过在websphere下建立共享库来根除,可参考附件
解决jar包冲突的工具类jarjar-1.4.rar,jar包冲突解决方法,解决jar与jar冲突,jar与aar冲突,不想删除任何一个包,只能修改其中一个jar包包名即可解决,解决方法详细请看这篇文章: ...
Maven解决jar冲突调试步骤
因为Struts自带的antlr-2.7.2.jar,比Hibernate3.3自带的antlr-2.7.6.jar的版本要低,故要删除前一个低版本的,, struts1.3 和2.1都带有antlr-2.7.2.jar ,,,下面我要把它们都清除了,由于myeclipse 添加的struts性能...
SSH整合jar包,彻底解决集成jar包冲突问题,内涵绝大部分常用框架的jar包和一些常用jar包
该文档用于解决在websphere application server 服务部署程序过程中会出现jar包冲突问题
压缩包里面有myself工程。里面只有一个类。可以自己创建两个版本的myself的jar包,然后测试osgi解决jar包冲突。
flink-sql-connector-hive-3.1.2_2.11-1.11.6.jar 已经解决guava冲突亲测可以
解决:face++的开发包faceppsdk.jar 和httpclient.jar 冲突,错误如下: Caused by: java.lang.NoSuchFieldError: INSTANCE at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<init>...
ksoap2.jar和小米系统中的jar包冲突,修改ksoap的包名即可。
easyExcel支持最低的POI版本是3.17,现有项目若已用POI版本比这高的话,希望不改变现有的引用,解决jar包冲突的话,使用该独立版的jar包。该包已改过包名,亲测可兼容使用,网上有说把poi升级到4.1.2但是试了导出...
2、重新打包的jar XmlSchema-1.1-expand-xfire.jar 替换 XmlSchema-1.1.jar xfire-all-1.2.6-incomplete.jar 替换 xfire-all-1.2.6.jar 3、XmlSchema-1.1.jar 可以与 xmlschema-core-*.jar 共存避开同路径同名类...
jstl Jar包 以及版本冲突问题解决 内附两个版本的Jar包 以及版本冲突解决方法
解决Tomcat与EL冲突 启动Tomcat时报错:Caused by: java.lang.LinkageError: loader constraints violated when linking javax/el/Expression...2. 换成tomcat5.5,不需要上述操作(3个jar放%app%/web-inf/lib下即可)
Hibernate的Antlr在Weblogic中产生Jar冲突的历史缘故以及解决办法
Android文件夹中是直接把commons-beanutils-1.7.0.jar中的org/apache/commons/collections目录和目录下的class删掉的
Maven的Jar包冲突问题,经常出现的场景为: 本地运行报NoSuchMethodError,ClassNotFoundException。明明在依赖里有这个Jar包啊。...定位冲突以及解决Jar包冲突的几个简单技巧 如何写一个干净依赖关系的POM文件