V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iv8d
V2EX  ›  Java

如何 mybatisplus 项目中覆盖 jar 中的 mapper.xml 文件

  •  
  •   iv8d · 8 天前 · 1242 次点击
    ## 覆盖 jar 中的 mapper.xml 文件

    mybatis plus 里的 xml 文件,如何本地工程里的覆盖 jar 里的 mapper.xml 。
    class 文件可以在相同路径写个同名的,就能覆盖 jar 里对应的 class 。mapper.xml 文件如何覆盖 jar 里对应的呢。
    26 条回复    2025-04-30 10:16:17 +08:00
    iv8d
        1
    iv8d  
    OP
       8 天前 via Android
    没人会吗
    pxiphx891
        2
    pxiphx891  
       8 天前
    为啥要这样搞?解压缩出来再运行呢?
    EscYezi
        3
    EscYezi  
       8 天前 via iPhone
    两个思路
    1. mapper.xml 最后还是要对应到 mapper Interface ,所以应该覆盖 interface 就行了
    2. 想办法让 jar 包里的 mapper.xml 不生效,能生效是因为在 mapperScan 的范围内。如果 jar 包里有自动配置让 jar 包内 mapperScan 生效就禁掉对应 bean 的加载;如果没有自动配置直接修改本地工程的 mapperScan 排除 jar 包内(不过不太确定 mapperScan 能不能扫到 jar 内)
    kivmi
        4
    kivmi  
       8 天前
    factoryBean.setMapperLocations 不是可以指定 mapper.xml 的路径么?
    iv8d
        5
    iv8d  
    OP
       8 天前
    @pxiphx891 想覆盖 jar 里 xml 里的功能,由本地自定义
    iv8d
        6
    iv8d  
    OP
       8 天前
    @kivmi 不会没关系,谢谢
    iv8d
        7
    iv8d  
    OP
       8 天前
    @EscYezi 可以扫到,目前相当于扫到两次 xml 文件了,导致 bean 冲突。不清楚具体怎么操作
    iv8d
        8
    iv8d  
    OP
       8 天前
    目前能想到的方案:
    1 、解压 jar 修改 xml 后再打包回去,比较麻烦
    2 、同路径写一个 xml ,放到 java 路径,目前未生效。
    WDATM33
        9
    WDATM33  
       8 天前
    说起来之前遇到个奇奇怪怪的 bug ,一个项目里面有两个模块都有独立的 mapper 类和 mapper xml 文件。他们的包路径不一样,mapperLocations 配置如下:
    <value>classpath:mybatis/module2/*.xml</value>
    <value>classpath:mybatis/module1/*.xml</value>
    奇怪的是有时候,这两个位置的 xml 都能正确的加载并且和 mapper 接口映射上。
    但是有时候你可能重启一次电脑,这两个路径的 xml 就只有一个能被正确加载映射了。
    查询的时候调用对应方法就会提示 无效的绑定。 我至今没找到问题所在,有时候 maven 重新加载一次就又好了
    Belmode
        10
    Belmode  
       7 天前
    @WDATM33 #9 这很常见,不是 bug 。jar 被加载的顺序本来就是不固定的,类也是。
    WDATM33
        11
    WDATM33  
       7 天前
    @Belmode 主要是哪怕顺序不一致 也不应该是有时候两个模块的 xml 都能被加载,有时候却又只能加载其中一个模块的 xml 。
    iv8d
        12
    iv8d  
    OP
       7 天前
    @WDATM33 资源可能是随机引入的,可能相互间会发生覆盖,漏应该不至于。
    WDATM33
        13
    WDATM33  
       7 天前
    @iv8d 还真的是漏了, 因为模块 1 和模块 2 都是只有 mapper 接口类和 xml , 这两的 jar 包都是通过引入到模块 3 来起服务的。而模块 1 和模块 2 操作的都是不同的表也不是同名的,不会有覆盖的问题,但是就经常出现上述问题。有时候只会引入模块 1 的文件,有时候只有 2 。有时候开发环境有这个问题,但是生产环境又没事。这玩意真是莫名其妙的,去源码打断点找了一下午没找到原因所在。
    iv8d
        14
    iv8d  
    OP
       7 天前
    @WDATM33 我猜你用的盗版插件
    Belmode
        15
    Belmode  
       7 天前
    @WDATM33 #13 要定位也简单。如果不是经常复现,就写给类把 Mybatis 的配置类 Bean 装配到进去,每次启动打印一下完成的 Mybatis 运行时配置详情,写到日志里,几次输出就能定位了。如果出现频率稍高,几次启停就能出现一次,直接打断点,看一下运行时的 mapper 实例,到底注册的是什么玩意就行了。
    siweipancc
        16
    siweipancc  
       7 天前 via iPhone
    接口重写方法就行,hook 掉也可以
    iv8d
        17
    iv8d  
    OP
       7 天前 via Android
    @siweipancc 怎么操作呢
    siweipancc
        18
    siweipancc  
       7 天前 via iPhone
    @iv8d 接口注释覆盖 xml ,这个我忘记优先级是哪个了。或者开个代理 hook 掉 xml 资源加载返回的路径,看下 springaop 的源码怎么玩的,但是你要做的是用 aspectj 。
    kivmi
        19
    kivmi  
       7 天前
    @WDATM33 Maven 多模块项目的扫描路径需以 `classpath*`:开头(即加载多个 jar 包下的 XML 文件)是不是需要加*
    kivmi
        20
    kivmi  
       7 天前
    @siweipancc 他这个的确只能从 spring 的生命周期入手,不然肯定冲突
    iv8d
        21
    iv8d  
    OP
       6 天前
    @siweipancc aop 将注册的 jar 里的 xml 路径换成我的? mapper 扫描时候处理?
    siweipancc
        22
    siweipancc  
       6 天前 via iPhone
    @iv8d 是的,思路是这个
    siweipancc
        23
    siweipancc  
       6 天前 via iPhone
    @iv8d 如果扫描器不是 bean ,你要用原生 aspectj
    iv8d
        24
    iv8d  
    OP
       6 天前 via Android
    @siweipancc xml 这种咋弄,只弄过方法切面
    totoro52
        25
    totoro52  
       6 天前
    mybaits 启动的时候会扫 xml ,在这个时候 hook 就行了
    zengyufei
        26
    zengyufei  
       6 天前
    1. classpath: 与 classpath*: 的区别

    classpath: 只会加载 第一个 匹配到的资源,按类加载器顺序查找,一旦找到就停止搜索。

    classpath*: 会加载所有匹配到的资源,包括 JAR 包内和工程内的,可能导致重复加载导致冲突。

    2. 配置 mybatis.mapper-locations
    在 Spring Boot 项目中,你可以通过 application.properties (或 application.yml )显式设置:

    # application.yml
    mybatis:
    mapper-locations:
    - classpath:mapper/local/**/*.xml # 本地优先
    - classpath*:mapper/**/*.xml # 备选加载所有(含 JAR )
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3324 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 04:48 · PVG 12:48 · LAX 21:48 · JFK 00:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.