方案思想
自定义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
分享到:
相关推荐
标题"weblogic部署项目jar冲突解决"指出的核心问题是JAR包冲突。这是因为不同的应用服务器可能内置了不同版本的库,或者在类加载机制上有差异,导致原本在Tomcat上运行良好的应用在WebLogic上出现问题。以下是一些...
"jar包冲突检测工具"正是为了解决这个问题而设计的。 这个工具的主要功能是帮助开发者检测出项目中可能存在的jar包冲突。它的工作原理可能是通过遍历指定路径下的所有jar文件,然后对比每个jar中的类文件,找出具有...
5. **冲突解决**:在OSGi中,冲突解决是通过版本规则来完成的。如果多个bundle导出了同一个包,OSGi会根据版本号选择一个合适的版本加载。这可以通过配置bundle的依赖关系和版本策略来实现。 6. **测试**:在OSGi...
### 解决网上应用厅部署在WAS上JAR包冲突问题 #### 背景介绍 在企业级应用开发与部署的过程中,经常会遇到各种技术挑战,其中之一就是在WebSphere Application Server (WAS) 上部署应用程序时遇到的JAR包冲突问题。...
在websphere8.5 下部署含有CXFwebservice的war包无法正常启动,...归根结底原因不是找不到类,而是发布后war下的jar与websphere自身平台下的jar冲突了,要解决此问题就要通过在websphere下建立共享库来根除,可参考附件
具体解决jar冲突的方法通常包括以下步骤: 1. **排除冲突的类**:正如描述中所述,可以直接删除"commons-beanutils-1.7.0.jar"中的`org/apache/commons/collections`目录及其下的所有class文件。这样可以避免与...
解决jar包冲突的工具类jarjar-1.4.rar,jar包冲突解决方法,解决jar与jar冲突,jar与aar冲突,不想删除任何一个包,只能修改其中一个jar包包名即可解决,解决方法详细请看这篇文章: ...
2. **排除冲突**:在Maven的pom.xml或Gradle的build.gradle文件中,使用`exclusions`或`exclude`规则,明确排除导致冲突的jar包。 3. **版本统一**:尽量让所有框架使用相同版本的公共库,避免版本差异带来的问题。...
5、涉及到的jar冲突,取决于自己的项目 pom示例:项目中存在冲突再 exclusion 添加即可 <groupId>com.customize</groupId> <artifactId>easyexcel <version>2.2.6 <groupId>javax.servlet <artifactId>...
5. **冲突解决策略**: - **优先级选择**:根据业务需求和库的重要程度设定优先级,选择保留某个版本的类。 - **代码重构**:如果冲突无法避免,可能需要对项目代码进行调整,避免使用冲突的类或方法。 6. **测试...
2. **删除冲突的Jar包**:在确定了冲突的Jar包后,我们需要删除那些不再需要或者过时的版本。按照描述中的方法,可以点击"Preferences"进入工程设置,然后找到与Spring相关的配置。在Spring的配置中,可能会列出一些...
### Maven解决jar冲突调试步骤详解 #### 一、问题背景及理解 在使用Maven进行项目构建时,可能会遇到各种依赖冲突的问题。依赖冲突通常发生在多个不同版本的库被加载到同一个ClassPath中,导致某些类加载出现问题...
因为Struts自带的antlr-2.7.2.jar,比Hibernate3.3自带的antlr-2.7.6.jar的版本要低,故要删除前一个低版本的,, struts1.3 和2.1都带有antlr-2.7.2.jar ,,,下面我要把它们都清除了,由于myeclipse 添加的struts性能...
6. **冲突解决策略**:有时,可能需要手动调整项目结构,创建自己的fat jar或Uber jar,将所有依赖合并为一个jar,以确保所有类都在同一环境中。 在具体操作中,`jarsTool`可能是一个用于检测jar包冲突的工具,它...
解决jar冲突的方法多种多样,以下是一些常用的技术和策略: 1. **排除依赖**:在Maven或Gradle等构建工具中,可以通过排除特定依赖来避免冲突。例如,在Maven中,可以在依赖管理部分添加`exclusions`标签来排除不...
"jar包冲突检测工具"正是为了解决这个问题而设计的。 这个工具是一个可执行的.exe程序,它允许开发者指定项目的jar包路径,然后自动进行冲突检测。通过这种方式,开发者可以快速地识别出哪些jar包之间存在冲突,...
com.googlecode.jarjar, 解决多版本依赖jar(需共存时的)冲突问题,修改包路径后的依赖将和冲突包彻底隔离开