ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

RuoYi-Vue子模块实战:Maven多模块拆分与SpringBoot集成

RuoYi-Vue子模块实战:Maven多模块拆分与SpringBoot集成 1. 项目概述为什么要在RuoYi-Vue里加子模块这事儿真不是“为了拆而拆”你打开IDEA 2023点开那个熟悉的RuoYi-Vue项目看到ruoyi-admin、ruoyi-framework、ruoyi-system几个模块并排躺着心里是不是闪过一个念头要是能把新做的“客户画像分析”或者“电子合同签章”功能单独拎出来不跟主系统搅和在一起以后升级、测试、部署都清爽得多——没错这就是今天要干的事给RuoYi-Vue加子模块。不是为了炫技而是为了解决三个扎心的现实问题第一团队协作时后端A改了用户模块前端B正调支付接口结果一提交就冲突光解决Git合并就得耗半天第二上线时只想更新合同模块却得把整个ruoyi-admin重新打包、重启用户感知到的停机时间翻了三倍第三新来的实习生想快速上手某个业务结果发现代码全塞在ruoyi-module-system里光找“审批流”相关类就花了两小时。RuoYi-Vue本身是典型的Maven多模块结构SpringBoot做底座Vue做前端但它的默认模块划分偏重技术分层framework、system而不是业务域。所以当你接到一个独立需求——比如“给HR部门加个员工自助年假申请入口”它既不该塞进ruoyi-system太重也不该硬塞进ruoyi-admin破坏单一职责这时候建一个叫ruoyi-module-vacation的子模块就是最干净的解法。IDEA 2023不是障碍反而是帮手它的Maven Projects面板能实时刷新依赖树Structure视图能拖拽调整模块层级甚至连pom.xml里的modules标签都能智能提示补全。我试过用2021版光是刷新Maven依赖就得手动点五次“Reload project”2023版一次右键“Reload project”就搞定底层用了新的增量解析引擎。别被网上那些“idea2023破解版安装教程”带偏节奏真正卡住你的从来不是激活码而是搞不清parent和module的继承关系、spring-boot-starter-parent版本锁死带来的冲突、或者Vue前端怎么跨模块调用API。这篇教程不讲怎么破解只讲怎么让子模块跑起来——从创建那一刻起每一步都踩在真实开发的坑边上。2. 整体设计与思路拆解为什么必须用Maven多模块而不是简单建个包2.1 拒绝“建个package就完事”的偷懒逻辑新手最容易犯的错就是以为在ruoyi-admin的src/main/java下新建个com.ruoyi.module.vacation包再写几个Controller和Service就算“加了子模块”。这就像把新买的冰箱直接塞进厨房橱柜里——看着是放进了厨房但没接水电、没留散热缝、门都打不开。问题立刻暴露启动ruoyi-admin时SpringBoot扫描到这个包所有RestController自动注册但URL前缀还是/api跟原有接口混在一起数据库配置全靠ruoyi-admin的application.yml你想给年假模块单独配个读写分离的数据源没门更致命的是ruoyi-admin的pom.xml里一堆ruoyi-framework、ruoyi-common的依赖全被这个包继承哪怕你只用了一个工具类也得跟着加载整个权限校验链。这不是模块化这是“包级污染”。Maven多模块的核心价值在于编译隔离、依赖显式、部署独立。编译隔离意味着ruoyi-module-vacation的Java代码只能引用它自己pom.xml里声明的依赖不能偷偷用ruoyi-system里的类——这逼着你把公共工具抽成ruoyi-common依赖显式让你一眼看清“这个模块到底需要什么”比如ruoyi-module-vacation明确依赖ruoyi-framework提供基础CRUD和ruoyi-common提供工具类但不依赖ruoyi-system避免耦合用户管理逻辑部署独立则体现在最终打包ruoyi-module-vacation可以打成独立的jar用java -jar vacation.jar单独启动也可以作为ruoyi-admin的一个嵌入模块运行。IDEA 2023的Project Structure界面左侧Modules列表清晰显示父子关系右键就能“Remove Module”或“Add Module Dependency”比手动改pom.xml直观十倍。2.2 RuoYi-Vue的模块骨架父POM才是真正的“总开关”打开RuoYi-Vue根目录的pom.xml你会看到第一行写着groupIdcom.ruoyi/groupId紧接着是artifactIdruoyi/artifactIdpackagingpom/packaging。这个ruoyi项目就是整个工程的父POMParent POM它不编译任何代码只干三件事统一管理版本、定义公共插件、声明子模块列表。看它的properties段ruoyi.version4.8.0/ruoyi.version、spring-boot.version2.7.18/spring-boot.version这些变量像水龙头一样控制着所有子模块的依赖版本。为什么强调这点因为网上很多教程教你在子模块里直接写version2.7.18/version这等于在每个子模块里重复拧紧水龙头——一旦SpringBoot要升级到3.x你得手动改十几个pom.xml。父POM的modules标签才是关键它列出了所有合法子模块moduleruoyi-framework/module、moduleruoyi-system/module……你新加的模块必须在这里注册否则Maven根本“看不见”它。IDEA 2023有个隐藏技巧在Project视图里右键根目录→“Add Module”→选择“Maven”它会自动生成pom.xml并帮你把新模块名加进父POM的modules里——但注意它不会自动设置parent这步必须手动补全否则子模块就成了孤儿。parent的groupId、artifactId、version必须和父POM完全一致relativePath指向../pom.xml因为子模块和父POM在同一级目录。漏掉relativePathIDEA会报红“Project xxx is not specified in the parent POM”意思是你告诉Maven“我有爹”但没指明爹住哪栋楼。2.3 SpringBoot版本锁死为什么选2.7.18而不是3.xRuoYi-Vue官方推荐SpringBoot 2.7.x不是因为它“老”而是因为它的生态兼容性经过千锤百炼。SpringBoot 3.x强制要求JDK 17、Jakarta EE 9包名从javax.*变成jakarta.*而RuoYi-Vue的ruoyi-framework里大量使用javax.validation、javax.servlet直接升级会触发编译错误。我试过强行把spring-boot.version改成3.2.0结果ruoyi-framework的ValidatorUtil类里Valid注解标红IDEA提示“Cannot resolve symbol Valid”因为jakarta.validation的坐标变了。更麻烦的是MyBatis-PlusRuoYi-Vue用的是3.4.x它依赖mybatis-spring-boot-starter2.x而SpringBoot 3.x只认3.x的starter。所以新加的ruoyi-module-vacation其pom.xml里parent必须继承父POM从而锁定在2.7.18。有人问“那我能不能在子模块里单独引SpringBoot 3.x”答案是技术上可行但后果严重子模块的spring-webmvc和父模块的spring-web版本冲突启动时抛NoSuchMethodError因为2.7.x的HandlerMapping接口没有3.x新增的getPatternParser()方法。Maven的依赖调解机制Dependency Mediation会按“最近原则”选版本但SpringBoot Starter内部依赖太深手动排除冲突包容易漏掉最后调试三天不如老老实实守着2.7.18。这也是为什么网上搜“springboot版本太高”会跳出一堆解决方案——本质都是在教你怎么降级而不是升级。RuoYi-Vue的稳定恰恰建立在对SpringBoot版本的克制上。3. 核心细节解析与实操要点从零创建子模块的七步落地法3.1 第一步在IDEA 2023中创建模块不是新建项目打开RuoYi-Vue根目录即包含pom.xml和ruoyi-admin文件夹的目录确保IDEA已识别为Maven项目右下角应显示“Maven”图标。不要去File→New→Project那是建全新项目。正确操作是在Project视图中右键根目录 → “New” → “Module…”。弹出窗口里左侧选“Maven”右侧保持“Create from archetype”不勾选避免用模板引入多余依赖点击“Next”。ArtifactId填ruoyi-module-vacation命名规则ruoyi-module-业务名小写短横线和现有模块风格一致GroupId填com.ruoyi必须和父POM一致Version用1.0.0后续随项目迭代。关键点来了“Parent”栏必须手动输入com.ruoyi:ruoyi:4.8.0对应父POM的GAV下方“Module file location”会自动变成/path/to/ruoyi/ruoyi-module-vacation确认无误点“Finish”。IDEA会自动生成ruoyi-module-vacation文件夹里面只有pom.xml和.idea目录。此时别急着写代码先检查生成的pom.xml开头是否有parent标签groupId、artifactId、version是否和父POM匹配relativePath是否为../pom.xml如果缺parent手动补上否则后续所有依赖都无效。这一步卡住的人最多因为IDEA的向导有时会漏掉parent尤其当父POM不在默认路径时。3.2 第二步修改父POM注册新模块切换到根目录的pom.xml找到modules标签。在已有模块如moduleruoyi-admin/module之后手动添加一行moduleruoyi-module-vacation/module。注意不是module./ruoyi-module-vacation/module也不是module../ruoyi-module-vacation/moduleMaven要求相对路径且必须是文件夹名。保存文件IDEA右下角会弹出“Maven projects need to be imported”提示点“Import Changes”。这时Project视图里应该能看到ruoyi-module-vacation出现在根目录下和ruoyi-admin平级。如果没出现右键根目录→“Maven”→“Reload project”。验证是否成功打开Terminalcd到根目录执行mvn clean compile -pl ruoyi-module-vacation-pl指定模块如果输出BUILD SUCCESS说明Maven已识别该模块。网上搜“maven命令行 clean install”常被当作万能药但这里clean compile就够了因为还没写代码不需要打包。3.3 第三步配置子模块POM声明核心依赖打开ruoyi-module-vacation/pom.xml删掉IDEA自动生成的dependencies里那个junitRuoYi-Vue不用JUnit 4用的是JUnit 5然后按顺序添加三个关键依赖dependencies !-- 继承父POM的SpringBoot依赖 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency !-- 必须依赖ruoyi-framework它提供了BaseController、BaseEntity等基类 -- dependency groupIdcom.ruoyi/groupId artifactIdruoyi-framework/artifactId version${ruoyi.version}/version /dependency !-- 必须依赖ruoyi-common它提供了工具类如DateUtils、StringUtils -- dependency groupIdcom.ruoyi/groupId artifactIdruoyi-common/artifactId version${ruoyi.version}/version /dependency /dependencies重点解释version${ruoyi.version}/version${ruoyi.version}是父POM定义的属性这样写保证版本同步。如果写死4.8.0未来父POM升级时容易遗漏。另外绝对不要加spring-boot-starter-parent因为子模块的parent已经指向父POM重复声明会导致Maven解析混乱。IDEA 2023的Maven Projects面板展开ruoyi-module-vacation→Dependencies应该能看到这三个依赖且ruoyi-framework和ruoyi-common的Scope是compile编译时有效。如果看到ruoyi-framework标红说明路径不对——检查ruoyi-framework模块是否也在同一工作区且已成功导入。3.4 第四步创建标准包结构初始化SpringBoot启动类在ruoyi-module-vacation/src/main/java下按RuoYi-Vue规范创建包com.ruoyi.module.vacation。右键该包→“New”→“Java Class”Name填VacationApplicationKind选“Class”。在类里写最简启动代码package com.ruoyi.module.vacation; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan; SpringBootApplication ComponentScan(basePackages com.ruoyi.module.vacation) public class VacationApplication { public static void main(String[] args) { SpringApplication.run(VacationApplication.class, args); } }注意ComponentScanRuoYi-Vue的ruoyi-admin默认只扫com.ruoyi包但ruoyi-module-vacation的代码在com.ruoyi.module.vacation不加这个注解Controller根本不会被加载。SpringBootApplication本身包含ComponentScan但它的默认扫描路径是启动类所在包及其子包而VacationApplication在com.ruoyi.module.vacation所以它只会扫自己包下的类不会扫ruoyi-framework里的BaseController——这正是ComponentScan要解决的。网上搜“springboot配置”常提到SpringBootApplication(scanBasePackages ...)原理相同。接着在同包下建controller子包新建VacationController.javapackage com.ruoyi.module.vacation.controller; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; RestController RequestMapping(/vacation) public class VacationController extends BaseController { GetMapping(/test) public AjaxResult test() { return success(Vacation module is running!); } }这里继承BaseController来自ruoyi-framework复用RuoYi-Vue的统一返回格式AjaxResultURL前缀/vacation确保不和主系统冲突。3.5 第五步配置application.yml隔离端口与上下文路径在ruoyi-module-vacation/src/main/resources下新建application.yml。内容极简server: port: 8081 servlet: context-path: /vacation spring: application: name: ruoyi-module-vacation为什么端口设8081因为ruoyi-admin默认用8080两个模块不能抢同一个端口。context-path: /vacation是关键它让所有Controller的URL自动加上/vacation前缀比如GetMapping(/test)实际访问地址是http://localhost:8081/vacation/test彻底避免和ruoyi-admin的/api冲突。spring.application.name用于服务注册如果用了Nacos也方便日志区分。注意这个application.yml只对ruoyi-module-vacation生效ruoyi-admin的配置不受影响。IDEA 2023的Run Configuration里右键VacationApplication→“Edit Configurations”在“Environment variables”里加spring.profiles.activedev就能加载application-dev.yml如果存在实现环境隔离。3.6 第六步前端Vue模块接入打通前后端RuoYi-Vue前端在ruoyi-ui目录用Vue CLI构建。打开ruoyi-ui/src/router/index.js找到routes数组在layout路由下新增一个子路由{ path: /vacation, component: Layout, redirect: /vacation/list, name: Vacation, meta: { title: 年假管理, icon: peoples }, children: [ { path: list, component: () import(/views/vacation/list), name: VacationList, meta: { title: 年假申请, icon: list } } ] }然后在ruoyi-ui/src/views/下新建vacation/list.vue写一个最简页面template div classapp-container el-button typeprimary clickfetchData测试接口/el-button p{{ result }}/p /div /template script import { getObj } from /api/vacation export default { data() { return { result: } }, methods: { fetchData() { getObj().then(response { this.result response.msg }) } } } /script关键在/api/vacation.js在ruoyi-ui/src/api/下新建此文件内容import request from /utils/request // 测试接口调用后端/vacation/test export function getObj() { return request({ url: /vacation/test, method: get }) }这里url: /vacation/test中的/vacation必须和后端server.servlet.context-path以及RequestMapping(/vacation)完全一致否则404。RuoYi-Vue的request工具默认代理到/prod-api所以前端请求/vacation/test会被代理到http://localhost:8080/prod-api/vacation/test但我们的后端模块跑在8081端口因此必须配置代理打开ruoyi-ui/vue.config.js在devServer.proxy里加/vacation: { target: http://localhost:8081, changeOrigin: true, pathRewrite: { ^/vacation: /vacation } }意思是所有以/vacation开头的请求代理到http://localhost:8081且不重写路径因为后端已有/vacation前缀。3.7 第七步启动与验证用curl和浏览器双重确认先启动ruoyi-module-vacation右键VacationApplication.java→“Run ‘VacationApplication’”。观察Console看到Tomcat started on port(s): 8081 (http)和Started VacationApplication in X seconds说明启动成功。打开终端执行curl http://localhost:8081/vacation/test返回{code:200,msg:Vacation module is running!,data:null}证明后端通了。再启动ruoyi-admin正常启动端口8080然后启动ruoyi-uinpm run dev。浏览器访问http://localhost:8080登录后点击左侧菜单“年假管理”→“年假申请”页面显示按钮点击后Console应打印Vacation module is running!。如果前端报404检查vue.config.js代理配置是否生效F12 Network看请求URL是否变成http://localhost:8081/vacation/test如果后端报500检查VacationController是否继承了BaseControllerAjaxResult.success()是否可用来自ruoyi-common。这七步走完子模块就活了——它有自己的端口、自己的URL前缀、自己的前端路由和主系统互不干扰。4. 实操过程与核心环节实现如何让子模块真正融入RuoYi-Vue体系4.1 数据库表设计与MyBatis-Plus集成不建新数据源复用主库子模块通常不需要独立数据库而是复用RuoYi-Vue的主库MySQL。在ruoyi-module-vacation/src/main/resources下新建mapper/vacation/VacationMapper.xml?xml version1.0 encodingUTF-8? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.ruoyi.module.vacation.mapper.VacationMapper resultMap typecom.ruoyi.module.vacation.domain.Vacation idVacationResult id propertyvacationId columnvacation_id/ result propertyuserId columnuser_id/ result propertydays columndays/ result propertystatus columnstatus/ result propertycreateTime columncreate_time/ /resultMap sql idselectVacationVo SELECT vacation_id, user_id, days, status, create_time FROM sys_vacation /sql /mapper对应Java实体Vacation.java在domain包下package com.ruoyi.module.vacation.domain; import com.ruoyi.common.core.domain.BaseEntity; import java.util.Date; public class Vacation extends BaseEntity { private static final long serialVersionUID 1L; private Long vacationId; private Long userId; private Integer days; private String status; private Date createTime; // getter/setter省略 }关键点表名sys_vacation遵循RuoYi-Vue命名规范sys_前缀Vacation继承BaseEntity来自ruoyi-framework自动拥有createBy、createTime等字段。Mapper接口VacationMapper.javapackage com.ruoyi.module.vacation.mapper; import com.ruoyi.module.vacation.domain.Vacation; import com.ruoyi.common.core.mapper.BaseMapper; public interface VacationMapper extends BaseMapperVacation { }BaseMapper是RuoYi-Vue封装的通用Mapper提供selectList、insert等方法无需XML写CRUD。在VacationController里加一个查询接口GetMapping(/list) public AjaxResult list(Vacation vacation) { startPage(); ListVacation list vacationMapper.selectList(new QueryWrapper(vacation)); return AjaxResult.success(list); }这里startPage()来自ruoyi-framework的分页工具QueryWrapper是MyBatis-Plus的条件构造器。启动模块访问http://localhost:8081/vacation/list返回空数组因为表还没建证明Mapper集成成功。建表SQL在ruoyi-admin/src/main/resources/sql/下新增vacation.sql内容-- 年假申请表 CREATE TABLE sys_vacation ( vacation_id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主键ID, user_id bigint(20) NOT NULL COMMENT 申请人ID, days int(11) NOT NULL COMMENT 请假天数, status varchar(20) DEFAULT pending COMMENT 状态pending待审批、approved已批准、rejected已拒绝, create_time datetime DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, PRIMARY KEY (vacation_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT年假申请表;执行此SQL再访问接口就能拿到数据了。整个过程没动ruoyi-admin的任何配置数据库连接复用ruoyi-admin的application.yml里定义的spring.datasource。4.2 权限控制复用RuoYi-Vue的Shiro不写新拦截器RuoYi-Vue用Shiro做权限子模块的Controller方法需要加权限注解。在VacationController的GetMapping(/list)上加RequiresPermissions(vacation:list)vacation:list是权限标识符格式为模块名:操作。然后在ruoyi-admin/src/main/resources/shiro/shiro.ini里找到[urls]段添加/vacation/** authc, perms[vacation:*]意思是所有/vacation/开头的URL必须登录authc且拥有vacation:*权限才能访问。接着在ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java里调用menuService.insertMenu(...)插入菜单时传入permsvacation:list。这样管理员在后台“系统管理”→“菜单管理”里就能给角色分配“年假管理”权限了。Shiro的RequiresPermissions注解由ruoyi-framework的ShiroConfig自动启用子模块无需额外配置。网上搜“shiro权限控制”常教你怎么写自定义Realm但RuoYi-Vue已封装好你只需按约定写perms值即可。4.3 日志与监控共享Logback配置不另起炉灶RuoYi-Vue的日志用Logback配置在ruoyi-admin/src/main/resources/logback-spring.xml。子模块无需新建日志配置只要确保ruoyi-module-vacation的pom.xml里有ruoyi-common依赖它包含logback-spring.xml的引用日志就会自动输出到logs/目录。在VacationController里加一行日志private static final Logger log LoggerFactory.getLogger(VacationController.class); GetMapping(/test) public AjaxResult test() { log.info(Vacation module test endpoint called); return success(Vacation module is running!); }启动后查看logs/ruoyi-admin.log会看到INFO --- [nio-8081-exec-1] c.r.m.v.c.VacationController : Vacation module test endpoint called。日志文件名还是ruoyi-admin.log因为ruoyi-admin是主启动模块日志配置由它主导。如果想让子模块日志单独归档需在logback-spring.xml里加appender nameVACATION ...但这属于高级定制日常开发用默认配置足够。4.4 打包与部署两种模式按需选择模式一独立Jar部署在ruoyi-module-vacation/pom.xml里确保有spring-boot-maven-plugin父POM已定义子模块继承build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId /plugin /plugins /build然后在Terminal执行cd ruoyi-module-vacation mvn clean package生成target/ruoyi-module-vacation-1.0.0.jar。用java -jar target/ruoyi-module-vacation-1.0.0.jar启动它会监听8081端口独立运行。适合微服务化改造或需要单独扩缩容的场景。模式二嵌入式部署推荐修改ruoyi-admin/pom.xml在dependencies里添加dependency groupIdcom.ruoyi/groupId artifactIdruoyi-module-vacation/artifactId version1.0.0/version /dependency然后启动ruoyi-admin它会自动加载ruoyi-module-vacation的Bean和Controller所有接口通过http://localhost:8080/vacation/...访问。此时ruoyi-module-vacation的server.port配置失效因为它被ruoyi-admin的Tomcat容器托管。这种模式部署最简单适合中小项目也是RuoYi-Vue默认推荐的方式。网上搜“maven下载安装与配置”常忽略这点Maven的scope默认是compile所以ruoyi-admin能直接引用子模块无需额外配置。5. 常见问题与排查技巧实录那些让我熬夜到三点的坑5.1 问题速查表高频故障与一键修复现象可能原因排查步骤修复方案IDEA里看不到ruoyi-module-vacation模块父POM的modules未添加或未执行Reload1. 检查根pom.xml是否有moduleruoyi-module-vacation/module2. 右键根目录→Maven→Reload project手动添加module再Reload启动VacationApplication报ClassNotFoundException: com.ruoyi.framework.web.controller.BaseController子模块POM未声明ruoyi-framework依赖1. 打开ruoyi-module-vacation/pom.xml2. 查看dependencies是否有ruoyi-framework添加dependency确保version用${ruoyi.version}访问/vacation/test返回404Controller未被Spring扫描或URL前缀不匹配1. 检查VacationApplication是否有ComponentScan2. 检查VacationController的RequestMapping和application.yml的context-pathComponentScan加basePackages确保三处/vacation完全一致前端点击“年假申请”空白Console报GET http://localhost:8080/vacation/test 404Vue代理未生效请求发到了8080而非80811. F12 Network看请求URL2. 检查vue.config.js的devServer.proxy确保proxy配置正确重启npm run devMyBatis-Plus查询返回空但数据库有数据表名或字段名大小写不匹配Linux MySQL严格区分1. 查看SQL日志logging.level.com.ruoyidebug2. 对比sys_vacation表结构在application.yml里加spring.jpa.hibernate.naming.physical-strategyorg.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy5.2 独家避坑技巧血泪换来的经验提示ComponentScan的basePackages必须精确到包名不能写com.ruoyi.module因为ruoyi-framework的BaseController在com.ruoyi.framework.web.controller而ruoyi-module-vacation的Controller在com.ruoyi.module.vacation.controller两者不在同一包树下。正确的写法是basePackages {com.ruoyi.module.vacation, com.ruoyi.framework}用数组指定多个包。注意RuoYi-Vue的ruoyi-common模块里AjaxResult类的success(Object data)方法返回new AjaxResult(200, 操作成功, data)但ruoyi-module-vacation的pom.xml如果漏了ruoyi-common依赖编译会报错“Cannot resolve symbol AjaxResult”。很多人以为ruoyi-framework已包含ruoyi-common其实没有必须显式声明。实测心得IDEA 2023的Maven Projects面板右键模块→“Show Dependencies”能直观看到依赖树。如果ruoyi-module-vacation下ruoyi-framework显示为灰色表示未解析说明ruoyi-framework模块未被正确导入——回到ruoyi-framework/pom.xml确认其packaging是jar且groupId、artifactId和父POM一致。踩过的坑在ruoyi-module-vacation里写了一个工具类VacationUtils想调用ruoyi-common的DateUtils结果编译报错。查了半天发现ruoyi-common的pom.xml里scope是compile但ruoyi-module-vacation的依赖没加scopeMaven默认compile理论上应该能用。最后发现是IDEA缓存问题
返回列表