1.问题描述
在本地开发中使用如下代码来获取所需要的文件全限定名,其中最关键的作用点是使用File类
String packagePath = packageName.replace(".", "/"); //替换为目录
URL url = ClassLoader.getSystemResource("");
File[] files = new File(url.getPath() + packagePath)
.listFiles(file -> file.getName().endsWith(".class"));
List<String> result = new ArrayList<>();
for(File file : files){
// 输出类名称
String fileName = file.getName();
fileName = fileName.substring(0,fileName.lastIndexOf("."));
//全限定类名
String allName = packageName+"."+fileName;
result.add(allName);
}
但是打成jar包后访问路径格式就会变成jar:file:/xxxxxx这样的类型导致了使用File获取路径资源是为null。
2.问题解决
直接上代码:
String packagePath = packageName.replace(".", "/"); //替换为目录
URL url = ClassLoader.getSystemResource("");
List<String> result = new ArrayList<>();
try {
Resource[] resources = new PathMatchingResourcePatternResolver().
getResources(ResourceUtils.CLASSPATH_URL_PREFIX + packagePath+"/*.*");
// 循环images文件夹下的所有文件
for(Resource fileResource : resources) {
//输出文件名称
String fileName = fileResource.getFilename();
fileName = fileName.substring(0,fileName.lastIndexOf("."));
String allName = packageName+"."+fileName;
System.out.println(allName);
result.add(allName);
}
} catch (Exception e) {
e.printStackTrace();
}
3.解决详述
主要使用PathMatchingResourcePatternResolver类来获取资源通过追溯源码可以看到底层是使用的这三种方式对单一类加载进行重写,最后使用ResourceUtils工具类将文件路径类型换成classpath:就可以实现对指定目录文件名遍历,上线后就避免了jar路径获取问题
cl = Thread.currentThread().getContextClassLoader();
cl = ClassUtils.class.getClassLoader();
cl = ClassLoader.getSystemClassLoader();