读取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", ""));
 
  

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



你可能感兴趣的:(java,jar,file,class)