使用我开发的框架,项目部署过程中突然出现问题,我使用Mybatis源码解决1.背景这篇文章是我对Swagger进行了二次开发,封装成框架,发布到m??aven私服上,这样就可以开箱即用了。但是出现了问题,导致部分功能打包成jar包后无法生效。
本文专门针对这个问题,通过学习Mybatis源码讲解如何解决。关于swagger扩展的功能,我也对相关扩展功能进行了严格的分析和开发,记录并整理,整理成一篇文章。
第一季技术创作训练营期间,发布到腾讯云+社区并参与活动:本文名称:《历经14天自定义3个注解解决项目的3个Swagger难题》链接地址:-jar运行jar包命令:还是不行6-6f26a2ab8-4c6b -b9ee-53ae9.png 但是在IDEA中启动时,没有问题。整个结构是这样的:0-17c94c55-7d83-ac4e-06cc0dbdeeaa.png。
有很多话要说。总结一下:当我开发的框架以依赖的形式被其他项目使用时,就会出现问题。
可以在IDEA开发环境中运行。其中一项功能需要读取项目中的某些文件。
但是当项目打包为jar包部署到服务器上时,这个功能出现了问题,无法正常读取文件。 3、如果遇到解决方案有问题,首先要在百度或者谷歌上搜索。
我连续多日寻找、尝试; 6-84cfc82d-41ae-a66b9a3cb.png 别看下面,我想出了很多错误,但几乎就只有那几个方法。我几乎尝试了所有这些,但没有一个是我想要的。
我想要的很特别:因为我正在开发一个框架,所以我需要从jar包中读取另一个jar包中的某些文件。 5-efce9-cf74-4ccf-9aac-df77daf59.png 最后不得不放弃百度。
就在我快要放弃的时候,突然想到Mybatis和我的差不多。 Mybatis也是一个jar包,Mybatis也是从jar包中读取。
取xxxxMapper.xml文件进行分析。 Mybatis读取xxxMapper.xml文件的方式和我开发的框架读取md文件的设计一模一样。
然后我就得去挖掘Mybatis的源码,研究它;之前想看一下Mybatis的源码,但是一直没有时间。现在是时候趁机学习一下Mybatis源码了。
我是从搭建Mybatis环境开始研究的,也做了比较详细的记录。如果你想学习Mybatis,可以继续关注我,我会把学习过程中记录的一些东西发布出来。
阅读链接:《1、构建源码环境》6-74f36f91-9fbc-4c87-bf69-1dbee0.png 解决方案: 1、阅读Mybatis源码,了解Mybatis是如何读取Mapper.xml文件的; 2.模仿Mybatis读取Mapper.xml文件的过程来改造自己的程序。 4、分析:Mybatis是如何加载xxxMapper.xml文件的?为了减少篇幅,本文跳过如何搭建Mybatis源码环境,直接描述分析过程;如果你想看,也可以加我微信:weiyi,我给你初稿版本。
或者你可以等我整理一下Mybatis源码系列文章再看一遍。 《1、构建源码环境》 (1) 创建可跟踪的程序。
为了跟踪Mybatis源码,我使用IDEA创建了2个Model,一个是Mybatis源码项目,另一个是测试程序。9-5ae89b54-41fb-9cfc-d51b8df4cc69.png 如果你想搭建这个环境,可以参考一下。
我写的这篇文章已经发布在语雀上:《1、构建源码环境》如果能访问到数据就成功了:0-a5bd44a8-f -a74a-eff73ae3.png (二)逐行分析 1.阅读的代码mybatis-config.xml 文件如下: 代码语言:txt copy String resource = "mybatis-config.xml";最终 Reader reader = Resources.getResourceAsReader(resource );鼠标点击getResourceAsReader,会看到下图: 可以看到,是使用流的形式读取配置文件,返回一个流对象7-15d97c66-4d2e-bf11fdca0b。源码中png的执行流程如下: 1-d5c7-3b74-4a3b-b31b-9b71.png 2、创建SqlSessionFactory 创建SqlSessionFactory的过程太复杂了。
我简单总结一下步骤:(1)从Reader流-config.xml配置文件的数据流中读取Mybatis; (2) 从流中读取xml配置文件中的“ .... ”根节点。 (3) 从“ .... ”根节点解析出各个子节点的数据,如:“mappers”、“environments”节点等; (4)解析“mappers”节点,得到xxxMapper.xml的存储方式和存储路径; (5)根据“mappers”节点中配置的信息选择性读取Mapper.xml文件; (5-1)如果是package方式: (5-1-1)首先判断是否是jar包,如果是,则以流的形式打开; (5-1-2)然后会扫描所有资源,扫描的同时检查是否是我们要找的路径,例如:com. truedei.mapper; (5-1-3)将所有符合要求的URL添加到资源中并返回。
在分析了具体的流程图之后,我们整理了一个流程图。您可以看一下:5-cb26-1b12-48f3-e0b6c2d9a48c.png。
到了这个位置,我们就会知道Mybatis是如何扫描Mapper.xml文件的。 5、Mybatis如何扫描Mapper.xml文件的总结。
我们比较关心的是如何从jar包中扫描出我们想要的资源路径。从上面的分析可以看出,是通过ResolverUtil类中的find()方法进行扫描的。
ResolverUtil.find()调用VFS类的VFS.getInstance().list(path)方法进行扫描。 VFS.getInstance().list(path)中有两个比较重要的方法。
一种是:getResources(path) *(核心) 一种是:list(url, path) 在list()接口中查找对应的路径,返回一个List集合。在list()接口中,最重要的是listResources()方法。
:该方法中,从jar文件流中查找包含路径的URL;如果符合要求,则添加到List中并返回。代码语言:txt 复制 protected List listResources(JarInputStream jar, String path) throws IOException { // 匹配名称时包含前斜杠和尾随斜杠 if (!path.startsWith("/")) { path = "/" + 路径; } if (!path.endsWith("/")) { 路径 = 路径 + "/"; } // 迭代条目并收集以请求路径开头的条目 List resources = new ArrayList<>(); for (JarEntry entry; (entry = jar.getNextJarEntry()) != null;) { if (!entry.isDirectory()) { // 如果缺少则添加前导斜杠 StringBuilder name = new StringBuilder(entry.getName()) ; if (name.charAt(0) != '/') { name.insert(0, '/'); } } // 检查文件名 if (name.indexOf(path) == 0) { if (log.isDebugEnabled()) { log.debug("找到资源:" + name); }// 修剪前斜杠 resources.add(name.substring(1)); } } } 返回资源;可以看出中间最核心的就是上面的代码下面的name.indexOf(path)就是用来匹配开头是否包含这个路径的代码语言: txt copy // 检查文件名 if (name.indexOf(path) == 0) { if (log.isDebugEnabled()) { log .debug("找到资源:" + name); } // 修剪前斜杠 resources.add(name.substring(1));然后我们可以猜测并修改为我们需要的。
比如我想查找包含.md的文件就是该后缀的文件的路径,那么可以修改为: 代码语言:txt copy // 检查文件名 if (name.indexOf(path) > 0) { if (log.isDebugEnabled()) { log.debug("找到资源:" + name); } // 修剪前斜杠 resources.add(name.substring(1));} 正如你所看到的,我们最终想要并且可以模仿的是两个核心java类:ResolverUtil.javaVFS。这两个java类恰好在Mybatis的i/o模块中:二话不说就复制到我开发的框架的项目中:8-6d65-6ecf-4e27-a3d7-0f3ad1ac5ef2.png 6.修改到自己想要的ResolverUtil中的find方法: 代码语言:txt copy/** * 查找包下的资源 * @param packageName * @return */ public ResolverUtil find(String packageName) { //更改表单中的路径的 com.trueei 进入: com/trueei String path = getPackagePath(packageName);尝试 { 列表 孩子 = VFS.getInstance().list(path); for (String child : Children) { if (child.endsWith(".class")) { //组装成新的文件路径 child = "/md "+child.substring(child.lastIndexOf('/')).替换(“类”,“md”); //child是我要加载的md文件的路径 loadJarFileByFile(child); } } } catch ( IOException ioe) { System.out.println("无法读取包:" + packageName+"-->"+ioe);返回这个; }自己写的: 代码语言:txt copy/** * 加载jar包资源文件 * @param file * @return */ private void loadJarFileByFile(String file) { InputStream stream = this.getClass().getResourceAsStream(file); if(stream==null){ 返回; BufferedReader br = null ;尝试{ br = new BufferedReader(new InputStreamReader(stream,"UTF-8"));字符串 s=null; while((s=br.readLine()) !=null){ //将每一行数据添加到全局List中,方便后面处理。
文件内容列表.add(s); } br.close(); } catch (FileNotFoundException e) { System.out.println("FileNotFoundException:"+e); } catch (IOException e) { System.out.println("IOException:"+e); }最后{ if(br !=null){ 尝试{ br.close(); } catch (IOException e) { System.out.println("关闭 br 错误:"+e); } } } } 7、成功的喜悦 9-6e39deaf-f9c9-4c19-aea5-68eecadb6.png 可以看到我要解析的md文件的数据也解析出来了:2-4d1ef5ef-0a2b-4abc- bea8-49dfa。
站长声明
版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件
举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。
相关文章
-
据投资界8月27日消息,内向基金(洞察基金)正式完成首期基金首轮超亿元募资,目标规模2亿元,将重点关注消费升级领域的股权投资。 据了解,引进基金是与新经济精品投行“穆棉资本”联合设立的私募股权投资基金。 它是由孙婷婷和Stefanie应金峰共同创立的。 两人在风险投资行
06-17
-
东方航天完成近6亿元B轮融资,重力2号中大型可回收液体火箭加速! |远景家族 远景资本 远景资本 远景资本 微信 IDvisionpluscapital 关于专题 远景资本公众平台汇聚创新趋势,以分享启发 01-25 17:12发布于浙江 近日,东方空间完成近6亿元B轮融资,本轮投资被梁溪科技创新产业
06-18
-
合肥市人民政府 据合肥市人民政府消息,5月5日,合肥市晶和集成电路股份有限公司在上海证券交易所上市。 成功登陆科创板,成为安徽省首家成功登陆资本市场的纯晶圆代工企业。 本次发行价格为19.86元。 超额配售选择权全额行使后,募集资金5500万元,在科创板上市公司融资规模
06-06
-
投资界(ID:pedaily)5月29日消息,国内质子交换膜电解槽核心材料及器件提供商合肥动量守恒绿色动力节能股份有限公司(以下简称“动力节能”)近日正式完成领投方数千万元天使轮融资。 本次完成交割的天使轮领投方为当看同创资本,元和资本担任天使轮融资独家投资方。 本轮融
06-18
-
投资界4月26日消息,近日,“新基建”全栈工业互联网产品提供商“退风科技完成5亿元B轮融资。 本轮融资由中金传输基金、深创投、交银国际、越秀金控联合领投,招商致远、青控招商、云启资本、亿唐宏图集成电路及互联网投资基金跟投老股东继续投资。 据悉,德丰科技在10个月内
06-18
-
Wind数据显示,截至2月3日,年初以来累计设立基金,发行规模7900万元。 其中,仅1月份就成立了一只基金,发行规模达4000万元,是继今年7月之后历史上第二高的单月发行规模。
06-18
-
投资界(ID:pedaily)4月24日消息,合肥登特菲医疗器械有限公司近日公告完成数千万元Pre-A轮融资。 本轮融资由海恒资本、宏博资本、创谷资本、合肥天使投资基金共同投资。 本轮融资完成后,登特菲将继续加大智能高端口腔医疗设备的创新研发,加大量产线建设,加速产品迭代和
06-17
-
2019年6月6日,北京安好时代科技发展有限公司发布了公司首款移动产品——安好APP,目前活跃用户量已达45万。 据悉,安好时代整合了大量医疗资源,打造了一支由数十名专职医生组成的团队。 不少医生入驻安好医生平台,开设个人诊所。 2019年6月28日,安好联合中国老年保健协会
06-17
-
Midjourney是一款基于AI的图像生成工具,专注于通过文字描述创建高质量的视觉内容。 主要功能: 1.图像生成:Midjourney接受用户通过文字输入的描述,并将这些描述转换为详细的图片。 用户可以指定样式、主题、颜色和其他元素。 2.风格模仿:该工具能够模仿艺术家已知作品的各
06-17
-
2018年,全球宏观经济和各类资产的表现大幅超出市场年初的悲观预期。 它已经悄然到来。 新的一年,投资者可能面临全球经济、政策和政治环境的哪些变化?如何调整投资策略应对风险并实现资产增值? 据投资界1月10日消息,宜信财富正式发布《年资产配置策略指引》(以下简
06-18
-
“罗哥,坚果没了”。 “嗯,是好事。 ”近日,字节跳动宣布暂停手机业务,原锤子科技团队成立的新石实验室,并入教育硬件团队。 业务方面,合并后的硬件团队将专注于教育领域,不再开发坚果手机、TNT显示器等其他无关产品。 坚果手机补充称,售后和系统维护将继续进行,手机
06-17
-
阿维塔11单电机版纯电动SUV介绍华为官宣M5高端智能手机驱动版氪倡议:联合抵制网络水军。 比亚迪即将推出“云柴系统”,疑似与底盘有关。 比亚迪新专利:可通过静脉识别解锁车辆理想ONE突然断电,售后服务需要保密协议。 阿维塔11单电机纯电动SUV今日发布。 在晚间的新品发布
06-21
最新文章
【玩转GPU】ControlNet初学者生存指南
【实战】获取小程序中用户的城市信息(附源码)
包雪雪简单介绍Vue.js:开学
Go进阶:使用Gin框架简单实现服务端渲染
线程池介绍及实际案例分享
JMeter 注释 18 - JMeter 常用配置组件介绍
基于Sentry的大数据权限解决方案
【云+社区年度征文集】GPE监控介绍及使用