之前有遇到过本地测试跑的通的代码,上到线上就失败的情况,当时是一个文件处理的操作。
后面才发现spring boot打的jar包,和直接本地用IDEA运行的代码多多少少还是有区别的,再一个就是windonws和linux系统,也多多少少有点不同。
这回写了扫描包代码,然后用jar测试了下,
下面是两个获取某个包下所有有特定注解类的代码,都是网上copy的
/**
* 不可用于jar
*/
public List<Class<?>> a() {
List<Class<?>> classList = new ArrayList<>();
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
MetadataReaderFactory metaReader = new CachingMetadataReaderFactory();
try {
Resource[] resources = resolver.getResources("classpath*:com/bzua/jingdata/service/**/*.class");
ClassLoader loader = ClassLoader.getSystemClassLoader();
for (Resource resource : resources) {
MetadataReader reader = metaReader.getMetadataReader(resource);
String className = reader.getClassMetadata().getClassName();
Class<?> clazz = loader.loadClass(className);
if (clazz.isAnnotationPresent(Report.class)) {
classList.add(clazz);
}
}
} catch (ClassNotFoundException | IOException e) {
log.error("错误信息: ", e);
}
return classList;
}
/**
* 可用于jar
*/
public List<Class<?>> b() {
List<Class<?>> classList = new ArrayList<>();
ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
final String BASE_PACKAGE = "com.bzua.jingdata.service";
final String RESOURCE_PATTERN = "/**/*.class";
try {
String pattern = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX +
ClassUtils.convertClassNameToResourcePath(BASE_PACKAGE) + RESOURCE_PATTERN;
Resource[] resources = resourcePatternResolver.getResources(pattern);
//MetadataReader 的工厂类
MetadataReaderFactory readerfactory = new CachingMetadataReaderFactory(resourcePatternResolver);
for (Resource resource : resources) {
//用于读取类信息
MetadataReader reader = readerfactory.getMetadataReader(resource);
//扫描到的class
String classname = reader.getClassMetadata().getClassName();
Class<?> clazz = Class.forName(classname);
//判断是否有指定主解
if (clazz.isAnnotationPresent(Report.class)) {
classList.add(clazz);
}
}
} catch (IOException | ClassNotFoundException e) {
}
return classList;
}