代码中使用的是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包中的所有文件,获取到想要的jar包 for (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", ""));
这样就获取到所有该路径下的所有类文件了。