`
flyPig
  • 浏览: 139577 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Jar冲突解决二

    博客分类:
  • Java
阅读更多

方案思想
自定义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冲突解决

    标题"weblogic部署项目jar冲突解决"指出的核心问题是JAR包冲突。这是因为不同的应用服务器可能内置了不同版本的库,或者在类加载机制上有差异,导致原本在Tomcat上运行良好的应用在WebLogic上出现问题。以下是一些...

    jar包冲突检测工具.zip

    "jar包冲突检测工具"正是为了解决这个问题而设计的。 这个工具的主要功能是帮助开发者检测出项目中可能存在的jar包冲突。它的工作原理可能是通过遍历指定路径下的所有jar文件,然后对比每个jar中的类文件,找出具有...

    osgi解决不同版本jar包冲突的demo

    5. **冲突解决**:在OSGi中,冲突解决是通过版本规则来完成的。如果多个bundle导出了同一个包,OSGi会根据版本号选择一个合适的版本加载。这可以通过配置bundle的依赖关系和版本策略来实现。 6. **测试**:在OSGi...

    解决网上应用厅部署在was上jar包冲突问题

    ### 解决网上应用厅部署在WAS上JAR包冲突问题 #### 背景介绍 在企业级应用开发与部署的过程中,经常会遇到各种技术挑战,其中之一就是在WebSphere Application Server (WAS) 上部署应用程序时遇到的JAR包冲突问题。...

    websphere下部署CXF项目jar包冲突问题解决方式

    在websphere8.5 下部署含有CXFwebservice的war包无法正常启动,...归根结底原因不是找不到类,而是发布后war下的jar与websphere自身平台下的jar冲突了,要解决此问题就要通过在websphere下建立共享库来根除,可参考附件

    JSONObject所须个包 已解决jar冲突

    具体解决jar冲突的方法通常包括以下步骤: 1. **排除冲突的类**:正如描述中所述,可以直接删除"commons-beanutils-1.7.0.jar"中的`org/apache/commons/collections`目录及其下的所有class文件。这样可以避免与...

    解决jar包冲突的工具类jarjar-1.4.rar

    解决jar包冲突的工具类jarjar-1.4.rar,jar包冲突解决方法,解决jar与jar冲突,jar与aar冲突,不想删除任何一个包,只能修改其中一个jar包包名即可解决,解决方法详细请看这篇文章: ...

    SSH整合jar包,彻底解决集成jar包冲突问题

    2. **排除冲突**:在Maven的pom.xml或Gradle的build.gradle文件中,使用`exclusions`或`exclude`规则,明确排除导致冲突的jar包。 3. **版本统一**:尽量让所有框架使用相同版本的公共库,避免版本差异带来的问题。...

    easyExcel、poi,jar包版本冲突,jar包处理

    5、涉及到的jar冲突,取决于自己的项目 pom示例:项目中存在冲突再 exclusion 添加即可 <groupId>com.customize</groupId> <artifactId>easyexcel <version>2.2.6 <groupId>javax.servlet <artifactId>...

    检查jar包冲突

    5. **冲突解决策略**: - **优先级选择**:根据业务需求和库的重要程度设定优先级,选择保留某个版本的类。 - **代码重构**:如果冲突无法避免,可能需要对项目代码进行调整,避免使用冲突的类或方法。 6. **测试...

    关于Myeclipse使用mybatis出现Jar包冲突的解决办法

    2. **删除冲突的Jar包**:在确定了冲突的Jar包后,我们需要删除那些不再需要或者过时的版本。按照描述中的方法,可以点击"Preferences"进入工程设置,然后找到与Spring相关的配置。在Spring的配置中,可能会列出一些...

    Maven解决jar冲突调试步骤

    ### Maven解决jar冲突调试步骤详解 #### 一、问题背景及理解 在使用Maven进行项目构建时,可能会遇到各种依赖冲突的问题。依赖冲突通常发生在多个不同版本的库被加载到同一个ClassPath中,导致某些类加载出现问题...

    ssh整合的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性能...

    检测工具 jar包冲突

    6. **冲突解决策略**:有时,可能需要手动调整项目结构,创建自己的fat jar或Uber jar,将所有依赖合并为一个jar,以确保所有类都在同一环境中。 在具体操作中,`jarsTool`可能是一个用于检测jar包冲突的工具,它...

    jar冲突问题解决方法记录

    解决jar冲突的方法多种多样,以下是一些常用的技术和策略: 1. **排除依赖**:在Maven或Gradle等构建工具中,可以通过排除特定依赖来避免冲突。例如,在Maven中,可以在依赖管理部分添加`exclusions`标签来排除不...

    jar包冲突检测工具

    "jar包冲突检测工具"正是为了解决这个问题而设计的。 这个工具是一个可执行的.exe程序,它允许开发者指定项目的jar包路径,然后自动进行冲突检测。通过这种方式,开发者可以快速地识别出哪些jar包之间存在冲突,...

    com.googlecode.jarjar解决多版本依赖jar(需共存时的)冲突问题工具,修改包路径后的依赖将和冲突包彻底隔离开

    com.googlecode.jarjar, 解决多版本依赖jar(需共存时的)冲突问题,修改包路径后的依赖将和冲突包彻底隔离开

Global site tag (gtag.js) - Google Analytics