[100分求助]如何从外部读取jar包中的资源文件

取你猪头 2012-07-27 03:01:41
问题背景 :
项目中需要开发从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下!

希望大家给点意见!
...全文
984 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zl3450341 2012-07-27
  • 打赏
  • 举报
回复
可以借鉴下spring的 classpth* 的读取方式
取你猪头 2012-07-27
  • 打赏
  • 举报
回复
结贴了,最后做个总结:1楼的思路,我试验过,和3楼的思路其实大致差不多!都是通过ClassLoader来LoadClass来实现!

其实我的问题又很简单:就是读取外部jar包中的资源文件(加载.class文件已经没问题)!
2楼的想法可以解决我的问题!
MiceRice 2012-07-27
  • 打赏
  • 举报
回复
直接创建个URLClassLoader,然后把新的jar包路径加入到URLClassLoader中,然后反射调用即可。

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

剩下的反射工作就很简单了。。。
取你猪头 2012-07-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

Class类的getResourceAsStream()方法来获取

http://hxraid.iteye.com/blog/483115
[/Quote]

我是动态的从外部加载jar包,不是从工程中直接引入加载好的jar文件!那篇文章挺好,但还是不能解决我的问题!
取你猪头 2012-07-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

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

Java code

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

多谢楼上两位朋友的帮助!本来让我都有种放弃这种方式,去需找其他的解决方案的想法!
楼上二位的想法让我少走了很多弯路!

希望也能让更多的人了解这块需求和解决思路!
brightyq 2012-07-27
  • 打赏
  • 举报
回复
Class类的getResourceAsStream()方法来获取

http://hxraid.iteye.com/blog/483115
nickycheng 2012-07-27
  • 打赏
  • 举报
回复
楼上的方法也是不错的。我想说的是通过jarFile也是能获取到jar里面文件内容的。


InputStream is = jarfile.getInputStream(jarfile.getEntry("META-INF/MANIFEST.MF"));
String s = IOUtils.toString(is, "gbk");
qybao 2012-07-27
  • 打赏
  • 举报
回复
直接把你的外部jar加载到systemclassloader试试看
可以通过反射的方式实现
for example
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

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧