之前有遇到过本地测试跑的通的代码,上到线上就失败的情况,当时是一个文件处理的操作。

后面才发现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;
    }