统一门户网站建设规范app制作教程视频全
news/
2025/9/23 6:15:12/
文章来源:
统一门户网站建设规范,app制作教程视频全,网站开发提问,网站seo如何做#x1f4e2;#x1f4e2;#x1f4e2;#x1f4e3;#x1f4e3;#x1f4e3; 哈喽#xff01;大家好#xff0c;我是「奇点」#xff0c;江湖人称 singularity。刚工作几年#xff0c;想和大家一同进步#x1f91d;#x1f91d; 一位上进心十足的【Java ToB端大厂… 哈喽大家好我是「奇点」江湖人称 singularity。刚工作几年想和大家一同进步 一位上进心十足的【Java ToB端大厂领域博主】 喜欢java和python平时比较懒能用程序解决的坚决不手动解决 ✨ 如果有对【java】感兴趣的【小可爱】欢迎关注我 ❤️❤️❤️感谢各位大可爱小可爱❤️❤️❤️ ———————————————— 如果觉得本文对你有帮助欢迎点赞欢迎关注我如果有补充欢迎评论交流我将努力创作更多更好的文章。 今天集团将大家使用的三方包的版本进行了升级其中涉及反射的Reflection的包Reflections工具的时候Jar包的版本是org.reflections:reflections:0.10.2发现在IntelliJ IDEA中运行是能正常扫描出Class对象但是部署在测试环境或者本地以Jar报运行时扫描不出来所以Debug了Reflections源码。
下面是创建Reflection对象的写法这个在0.9.x版本的时候是没问题的但是升级到0.10之后就有问题了找了好半天才解决问题这里记录一下解决问题的心得和过程供大家参考。 点进去最终会调用这个方法来初始化配置
public static ConfigurationBuilder build(Object... params) {final ConfigurationBuilder builder new ConfigurationBuilder();// flattenListObject parameters new ArrayList();for (Object param : params) {if (param.getClass().isArray()) { for (Object p : (Object[]) param) parameters.add(p); }else if (param instanceof Iterable) { for (Object p : (Iterable) param) parameters.add(p); }else parameters.add(param);}ClassLoader[] loaders Stream.of(params).filter(p - p instanceof ClassLoader).distinct().toArray(ClassLoader[]::new);if (loaders.length ! 0) { builder.addClassLoaders(loaders); }FilterBuilder inputsFilter new FilterBuilder();builder.filterInputsBy(inputsFilter);for (Object param : parameters) {if (param instanceof String !((String) param).isEmpty()) {builder.forPackage((String) param, loaders);inputsFilter.includePackage((String) param);} else if (param instanceof Class !Scanner.class.isAssignableFrom((Class) param)) {builder.addUrls(ClasspathHelper.forClass((Class) param, loaders));inputsFilter.includePackage(((Class) param).getPackage().getName());} else if (param instanceof URL) {builder.addUrls((URL) param);} else if (param instanceof Scanner) {builder.addScanners((Scanner) param);} else if (param instanceof Class Scanner.class.isAssignableFrom((Class) param)) {try { builder.addScanners(((ClassScanner) param).getDeclaredConstructor().newInstance()); }catch (Exception e) { throw new RuntimeException(e); }} else if (param instanceof Predicate) {builder.filterInputsBy((PredicateString) param);} else throw new ReflectionsException(could not use param param );}if (builder.getUrls().isEmpty()) {// scan all classpath if no urls provided todo avoidbuilder.addUrls(ClasspathHelper.forClassLoader(loaders));}return builder;}在For循环中第一个if如果是String类型的参数就会设置package然后会设置filter问题就出现在这里。这种简写方式filter是和包名一样的。在本地IDEA中所有文件都是在out目录下文件的目录是正常包名开头如下格式 com/jay/userinterface/authority/model/dto/ProductVO.class 但是如果是以Jar包运行的方式因为SpringBoot 2.x版本打包时会做一些处理加一些启动类导致文件结构会发生变化读者可以解压一个SpringBoot的Jar包看看实际结构。这种情况下获取文件的名称是如下格式
在扫描过程中这些文件都过不了Filter的校验。
大致过程就是在Reflections类中scan()方法对每个文件都会根据Filter过滤下这个Filter就是一个正则表达式的匹配表达式就是com/jay/userinterface/*以Jar包方式运行的话所有文件都会被过滤掉扫描结果就为空。
解决方案
使用另外一种写法自己构造Reflections的 Configuration手动设置Filter
Reflections reflections new Reflections(new ConfigurationBuilder().forPackages(packageName).filterInputsBy(new FilterBuilder().includePackage(BOOT-INF.classes. packageName)).setScanners(Scanners.MethodsAnnotated));我这里面是直接加了前缀每个文件在Jar包中的实际路径和Springboot打包后文件格式有关Springboot 1.x版本应该是不用改的。
也可以通过FilterBuilder的includePattern()方法来直接写正则表达式兼容IDEA运行和Jar包运行的方式。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/911565.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!