## 覆盖 jar 中的 mapper.xml 文件

mybatis plus 里的 xml 文件,如何本地工程里的覆盖 jar 里的 mapper.xml 。
class 文件可以在相同路径写个同名的,就能覆盖 jar 里对应的 class 。mapper.xml 文件如何覆盖 jar 里对应的呢。

没人会吗

为啥要这样搞?解压缩出来再运行呢?

两个思路

  1. mapper.xml 最后还是要对应到 mapper Interface ,所以应该覆盖 interface 就行了
  2. 想办法让 jar 包里的 mapper.xml 不生效,能生效是因为在 mapperScan 的范围内。如果 jar 包里有自动配置让 jar 包内 mapperScan 生效就禁掉对应 bean 的加载;如果没有自动配置直接修改本地工程的 mapperScan 排除 jar 包内(不过不太确定 mapperScan 能不能扫到 jar 内)

    factoryBean.setMapperLocations 不是可以指定 mapper.xml 的路径么?

    想覆盖 jar 里 xml 里的功能,由本地自定义

    不会没关系,谢谢

    可以扫到,目前相当于扫到两次 xml 文件了,导致 bean 冲突。不清楚具体怎么操作

    目前能想到的方案:

  3. 、解压 jar 修改 xml 后再打包回去,比较麻烦
  4. 、同路径写一个 xml ,放到 java 路径,目前未生效。

    说起来之前遇到个奇奇怪怪的 bug ,一个项目里面有两个模块都有独立的 mapper 类和 mapper xml 文件。他们的包路径不一样,mapperLocations 配置如下:
    classpath:mybatis/module2/*.xml
    classpath:mybatis/module1/*.xml
    奇怪的是有时候,这两个位置的 xml 都能正确的加载并且和 mapper 接口映射上。
    但是有时候你可能重启一次电脑,这两个路径的 xml 就只有一个能被正确加载映射了。
    查询的时候调用对应方法就会提示 无效的绑定。 我至今没找到问题所在,有时候 maven 重新加载一次就又好了

    #9 这很常见,不是 bug 。jar 被加载的顺序本来就是不固定的,类也是。

    主要是哪怕顺序不一致 也不应该是有时候两个模块的 xml 都能被加载,有时候却又只能加载其中一个模块的 xml 。

    资源可能是随机引入的,可能相互间会发生覆盖,漏应该不至于。

    还真的是漏了, 因为模块 1 和模块 2 都是只有 mapper 接口类和 xml , 这两的 jar 包都是通过引入到模块 3 来起服务的。而模块 1 和模块 2 操作的都是不同的表也不是同名的,不会有覆盖的问题,但是就经常出现上述问题。有时候只会引入模块 1 的文件,有时候只有 2 。有时候开发环境有这个问题,但是生产环境又没事。这玩意真是莫名其妙的,去源码打断点找了一下午没找到原因所在。

    我猜你用的盗版插件

    #13 要定位也简单。如果不是经常复现,就写给类把 Mybatis 的配置类 Bean 装配到进去,每次启动打印一下完成的 Mybatis 运行时配置详情,写到日志里,几次输出就能定位了。如果出现频率稍高,几次启停就能出现一次,直接打断点,看一下运行时的 mapper 实例,到底注册的是什么玩意就行了。

    接口重写方法就行,hook 掉也可以

    怎么操作呢

    接口注释覆盖 xml ,这个我忘记优先级是哪个了。或者开个代理 hook 掉 xml 资源加载返回的路径,看下 springaop 的源码怎么玩的,但是你要做的是用 aspectj 。

    Maven 多模块项目的扫描路径需以 classpath*:开头(即加载多个 jar 包下的 XML 文件)是不是需要加*

    他这个的确只能从 spring 的生命周期入手,不然肯定冲突