读取JAR中的文件,解决URI is not hierarchical错误

代码中使用的是File f = new File(this.getClass().getResource("路径/目录").toURI());读取该路径下所有文件,本来在代码环境下运行是正常的,可是后来打包后,在运行出现URI   is   not   hierarchical 错误。

经过DEBUG发现,原来本地时,读取文件时,URI路径是:file:/E:/idea-workspace/project/module(jar包所在的module)/target/classes/package/路径或者目录,但是打包之后,同样是读取该路径下的所有文件,但是URI却变成了:jar:file:/E:/idea-workspace/project/module(war打包的模块)/target/war包名称/WEB-INF/lib/需要读取的包名称.jar!/路径或者是目录,从jar所在模块读取文件变成了从war中的lib下的打包好的jar中读取class文件,报错URI   is   not   hierarchical 错误。

解决方式:因为我是要读取路径下的所有文件而不是一个具体的文件,不能用getResourceAsStream(“filename”)得到输入流的方式来得到文件,

//获取根路径下的文件,打包后以war包下面的WEB-INF下的classes为根路径
File classesFiles = new File(classLoader.getResource("/").toURI());
//因为我们要用是lib包中的jar包,需要向上返回一级WEB-INF
File parentFile = classesFiles.getParentFile();
//获取到上一级WEB-INF下的所有文件
File[] webFiles = parentFile.listFiles();
//遍历所有文件,找到lib包,并遍历lib包中的所有文件,获取到想要的jarfor (File web:webFiles){
    if ("lib".equals(web.getName())){
        File[] targetJar = web.listFiles(new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                if (pathname.getName().contains("想获取到的jar包名称")) {
                    return true;
                }
                return false;
            }
        });
        //通过jar包遍历,获取所有class文件,如果有特定命名,也可以进一步过滤
        for (File targetClass :targetJar
                ) {
            //bizClass现在就是所需要的jar包了
            JarFile jarFile = new JarFile(targetClass);

            Enumeration enu = jarFile.entries();
            while (enu.hasMoreElements()) {
                JarEntry jarEntry = (JarEntry) enu.nextElement();
                String name = jarEntry.getName();
                //进一步通过特殊标识筛选具体文件
                if (name.endsWith("特殊标识.class")) {
                    File newFile = new File(name);
                    list.add(newFile);
                }
            }
        }
    }
}

再对得到的文件集合resources进行遍历

//载入包下的类
Class<?> clazz = classLoader.loadClass( "指定路径" + "." + resources.get(i).getName().replace(".class", ""));
 

这样就获取到所有该路径下的所有类文件了。



  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值