问题描述:
由于历史原因,系统采用了很早期的poi,而最新的poi和之前版本并不兼容,现在要系统要增加一个新功能,需要引入最新的jar文件,在不影响已有使用的基础上,我们如何处理该问题?
解决方案:
本人的思路是写一个类加载器,动态的加载所需的jar文件到一个单独的命名空间,由于jvm默认的类加载是采用父委托机制的,但在这里,类加载器的实现思路和一些web 容器的类加载机制是一致的(如tomcat jetty等) ,即优先加载自己指定路径下的jar文件,如果加载不到所需的类文件则委托给父加载器,所以我们需重写ClassLoader的loadClass方法,最后上代码,代码很简单,但有一点比较重要,即默认java类所依赖的类是采用和该类相同的类加载器加载的
public class ParentLastClassLoader extends ClassLoader{ private String[] jarFiles; //jar文件路径 private Hashtable classes = new Hashtable(); //将定义的类缓存在hashtable里面 public ParentLastClassLoader(ClassLoader parent, String[] paths) { super(parent); this.jarFiles = paths; } @Override public Class<?> findClass(String name) throws ClassNotFoundException { throw new ClassNotFoundException(); } @Override protected synchronized Class<?> loadClass(String className, boolean resolve) throws ClassNotFoundException { try { byte classByte[]; Class result = null; //先从缓存中查看是否已经加载该类 result = (Class) classes.get(className); if (result != null) { return result; } //如果没找到该类,则直接从jar文件里面加载 for(String jarFile: jarFiles){ try { JarFile jar = new JarFile(jarFile); JarEntry entry = jar.getJarEntry(className.replace(".","/") + ".class"); InputStream is = jar.getInputStream(entry); ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); int nextValue = is.read(); while (-1 != nextValue) { byteStream.write(nextValue); nextValue = is.read(); } classByte = byteStream.toByteArray(); if(classes.get(className) == null){ result = defineClass(className, classByte, 0, classByte.length, null); classes.put(className, result); } } catch (Exception e) { continue; } } result = (Class) classes.get(className); if (result != null) { return result; } else{ throw new ClassNotFoundException("Not found "+ className); } } catch( ClassNotFoundException e ){ return super.loadClass(className, resolve); } } }
相关推荐
解决jar包冲突的工具类jarjar-1.4.rar,jar包冲突解决方法,解决jar与jar冲突,jar与aar冲突,不想删除任何一个包,只能修改其中一个jar包包名即可解决,解决方法详细请看这篇文章: ...
在websphere8.5 下部署含有CXFwebservice的war包无法正常启动,...归根结底原因不是找不到类,而是发布后war下的jar与websphere自身平台下的jar冲突了,要解决此问题就要通过在websphere下建立共享库来根除,可参考附件
在tomcat下部署成功,迁移到weblogic下,报错,一般都是配置和jar包问题,配置问题开发根据报错能解决,jar冲突比较烦人,这里给出了解决方案。
该文档用于解决在websphere application server 服务部署程序过程中会出现jar包冲突问题
jar包中类的加载及jar中资源的使用,在文件家exam1中。
SSH整合jar包,彻底解决集成jar包冲突问题,内涵绝大部分常用框架的jar包和一些常用jar包
解决jar包类名冲突问题
jstl Jar包 以及版本冲突问题解决 内附两个版本的Jar包 以及版本冲突解决方法
Maven的Jar包冲突问题,经常出现的场景为: 本地运行报NoSuchMethodError,ClassNotFoundException。明明在依赖里有这个Jar包啊。怎么运行不了!? 项目中明明定义着某个jar包版本为2.0.2,怎么打包之后变成2.5.0了...
压缩包里面有myself工程。里面只有一个类。可以自己创建两个版本的myself的jar包,然后测试osgi解决jar包冲突。
在商业化开发中经常是将开发的类打成jar包发布.由于有很多第三方的提供功能集合Jar包,所以经常会用到这些功能包.以下情景是很多Java开发人员经常碰到的:在开发,调试阶段,通过在CLASSPATH中设置第三方的jar包...
该类加载器用于从指向 JAR 文件和目录的 URL 的搜索路径加载类和资源。如果不是以该字符结束,则认为该 URL 指向一个将根据需要打开的 JAR 文件pac
Maven解决jar冲突调试步骤
检查jar包冲突检查jar包冲突检查jar包冲突检查jar包冲突
Java 自动加载JAR文件并运行其中的类方法
构建maven工程时pom.xml中引入依赖时有红色字体,setting处理了,也将jar包的版本号都试了一遍,还是没解决,后来请教大牛,原来是没连网,maven工程加载了一部分jar包,连网之后自动下载的jar包跟之前的冲突,用这...
通过动态加载jar包的方式,反射调用内部方法
Hibernate+Struts jar包冲突问题