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

maven 多模块拆分导致循环依赖问题

  •  
  •   ChenGangS · 2022-07-12 08:58:19 +08:00 · 2686 次点击
    这是一个创建于 884 天前的主题,其中的信息可能已经有所发展或是发生改变。

    新人第一次提问,感谢各位大佬

    是我的一个练手项目,目前使用了 springBoot ,我拆分了一个系统模块,OA 模块
    系统模块包含了基本的后台管理和用户授权那块,同时还包含了 springboot 的启动类
    OA 模块包含了 OA 的审批功能等等。

    现在遇到的问题:

    系统模块中有一个用户服务,我在 OA 模块里需要用到它, 我就需要在 OA 模块中引入系统模块才能使用到这个服务
    而系统模块中必须引入 OA 模块以便被 spring 扫描,那么问题就来了,就发生了 A 需要 B ,B 需要 A 的循环依赖问题。

    我想到的解决方案:

    改造系统模块,拆分成多个 module ,分别单独暴露出 service 和 mapper 等类,让 OA 单独引用这个暴露的 service 模块而不需要引用整个系统模块

    1.我想知道这样做是否可行,会有其他坑嘛
    2.是否为主流的解决方案
    3.我想知道还有其他解决方案嘛

    谢谢啦!

    windyboy
        1
    windyboy  
       2022-07-12 09:10:20 +08:00
    关键字 exclude
    ChenGangS
        2
    ChenGangS  
    OP
       2022-07-12 09:17:23 +08:00
    @windyboy 排除不了的,因为系统模块必须引入 OA 模块才能加入到容器, 而 OA 模块又需要系统模块的一些服务, 这就导致两个模块互相需要
    windyboy
        3
    windyboy  
       2022-07-12 09:37:14 +08:00
    @ChenGangS 毛病在于你自己锁自己
    可以使用不依赖同一个版本,保持 API 的情况下,以来一个低版本可以绕过
    但问题还是来源于自身
    jamel
        4
    jamel  
       2022-07-12 09:45:38 +08:00   ❤️ 1
    把公用的提取出来,可以叫 api 、common 啥的。尽量少依赖于框架,尽量使用 spi 机制
    VeryZero
        5
    VeryZero  
       2022-07-12 09:46:04 +08:00   ❤️ 1
    感觉就不应该把 OA 和系统服务拆成多个 module 。如果 service 都要单独一个 module ,我个人感觉失去了多模块的意义。最终还是耦合在一起。

    获取把启动类单独拆成一个 module ,这样可以让启动类依赖 OA 和系统服务,但是 OA 和系统服务不互相依赖。
    jamel
        6
    jamel  
       2022-07-12 09:46:42 +08:00   ❤️ 1
    如果是 spring 的话可以使用 spring.factories
    carrie96
        7
    carrie96  
       2022-07-12 10:17:43 +08:00
    要不拆分成不同的服务?
    ChenGangS
        8
    ChenGangS  
    OP
       2022-07-12 10:33:53 +08:00
    @VeryZero 感谢,我按照你的方法把启动类拆成了单独的 module ,确实把启动类放在系统模块不太妥,因为我是参考开源项目 eladmin 的拆法,但我发现这个拆法后期新增模块都必须依赖这个系统模块,导致出现奇奇怪怪的问题。
    alvinbone88
        9
    alvinbone88  
       2022-07-12 10:43:11 +08:00   ❤️ 1
    要拆的话应该把各种 api 拆出来作为各模块的依赖,api 的实现则由单独的模块提供
    nothingistrue
        10
    nothingistrue  
       2022-07-12 10:54:57 +08:00   ❤️ 1
    简单得很(不简单),把 OA 依赖得用户授权也拆成独立模块。拆分从来都是业务拆分,不是物理位置拆分。你这个系统(含用户)、OA 的拆分导致业务双向依赖,是很不好的拆分。业务依赖方向应该是:应用程序,OA ,系统底层。其中只有应用程序是可启动的,后面的都是不可启动的库。
    hhjswf
        11
    hhjswf  
       2022-07-12 11:11:18 +08:00
    系统模块是基础模块,不应该去依赖上级模块呀
    ChenGangS
        12
    ChenGangS  
    OP
       2022-07-12 11:31:41 +08:00
    @hhjswf 是的,我一开始就是按照开源项目那样去拆,发现根本走不通,后面我按照楼上大佬的方式拆,可以了
    ChenGangS
        13
    ChenGangS  
    OP
       2022-07-12 11:32:25 +08:00
    @alvinbone88 感谢,这个方式也不错,后期改造成微服务会更加简单,get !
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1221 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 17:40 · PVG 01:40 · LAX 09:40 · JFK 12:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.