日期:2014-05-19  浏览次数:20786 次

[100分求助]如何从外部读取jar包中的资源文件
问题背景 :
  项目中需要开发从AA地方到BB地方的数据映射转换的一段程序(以下简称某某转换器)!
  然后转换器是以jar包的形式存放在数据库中,然后被系统动态执行调用。
  现在转换器jar包中加入了drool的规则文件,也就是说在jar包中的转换程序需要调用drools的规则文件!
  
问题来了 :
  现在在主系统中动态调用转换器jar包时,出现加载不了drools的规则文件错误信息!

我使用JDK自带的JarFile、JarEntry,发现JarEntry返回的信息都很简单,当然我可以使用JarEntry动态去生成jar包中的某个class文件!但是始终找不到如何获取jar包中的资源文件的方法!

PS:
  我自己也知道主系统的ClassLoader和jar包中的ClassLoader不同,会导致主系统中读取不到jar包中的资源文件
  
  那用什么办法能够读取到外部jar包中的资源文件呢?

注意这里的jar包是动态读取的,没有加载在classpath下!

希望大家给点意见!

------解决方案--------------------
直接把你的外部jar加载到systemclassloader试试看
可以通过反射的方式实现
for example
Java code
URLClassLoader loader = (URLClassLoader) ClassLoader.getSystemClassLoader();
Method method = URLClassLoader.class.getDeclaredMethod("addURL", new Class[] { URL.class }); //反射获取方法
method.setAccessible(true); 
File jar = new File(yourjarpath); //外部jar路径
URL url = jar.toURI().toURL();
method.invoke(loader, new Object[]{url}); //加载jar到systemclassloader

------解决方案--------------------
楼上的方法也是不错的。我想说的是通过jarFile也是能获取到jar里面文件内容的。

Java code

InputStream is = jarfile.getInputStream(jarfile.getEntry("META-INF/MANIFEST.MF"));
String s = IOUtils.toString(is, "gbk");

------解决方案--------------------
Class类的getResourceAsStream()方法来获取

http://hxraid.iteye.com/blog/483115
------解决方案--------------------
直接创建个URLClassLoader,然后把新的jar包路径加入到URLClassLoader中,然后反射调用即可。

URLClassLoader loader = new URLClassLoader(ClassLoader.getSystemClassLoader());
loader.addURL(new URL("............"));

剩下的反射工作就很简单了。。。