SpringBoot整合MyBatisPlus时Mapper注入失败的排查与解决

发布时间:2026/8/7 5:12:29

SpringBoot整合MyBatisPlus时Mapper注入失败的排查与解决
1. 项目概述一个让开发者头疼的“找不到”问题如果你正在使用SpringBoot整合MyBatisPlus进行开发那么“XXXXMapperthat could not be found”这个错误提示大概率是你绕不开的一道坎。这行看似简单的报错信息背后却可能隐藏着从项目配置、注解使用到构建部署等多个环节的疏漏。它就像一个幽灵时不时在项目启动或单元测试时冒出来打断你的开发节奏。今天我们就来彻底拆解这个问题从根因分析到排查路径再到解决方案分享一套我实战中总结出来的、行之有效的处理“组合拳”。无论你是刚接触这个技术栈的新手还是已经踩过几次坑的老鸟相信这篇内容都能帮你建立起一套清晰的排查思路下次再遇到时能快速定位精准解决。2. 问题根因深度剖析为什么Mapper会“消失”在深入解决方案之前我们必须先理解SpringBoot与MyBatisPlus整合后Mapper接口是如何被识别和管理的。这决定了我们排查问题的方向。2.1 MyBatisPlus的核心注册机制MyBatisPlus以下简称MP是MyBatis的增强工具它简化了CRUD操作但其核心的Mapper接口注册机制依然建立在MyBatis的基础之上。SpringBoot通过自动配置帮助我们完成了大部分整合工作其核心流程可以概括为扫描阶段Spring容器启动时会寻找被MapperScan注解标注的配置类或者寻找项目中带有Mapper注解的接口。代理生成阶段对于扫描到的Mapper接口MyBatis会通过动态代理技术为每一个接口生成一个代理对象即我们常说的Mapper代理。Bean注册阶段生成的代理对象会被注册为Spring容器中的一个Bean其Bean的名称默认是接口类名首字母小写例如UserMapper接口对应的Bean名称是userMapper。依赖注入阶段当我们在Service层使用Autowired注入UserMapper时Spring就会从容器中找到这个代理Bean并完成注入。“XXXXMapperthat could not be found”错误的本质就是在上述流程的第1步或第3步出现了断点。Spring容器里根本没有这个Mapper对应的Bean自然无法注入。2.2 常见根因分类与表象根据我的经验这个问题主要可以归结为以下几大类每一类都有其特定的错误表象和触发场景2.2.1 扫描路径问题最常见这是新手最容易踩的坑。MapperScan注解的basePackages或value属性配置的包路径没有覆盖到你的Mapper接口所在的包。或者你既没有使用MapperScan也没有在Mapper接口上使用Mapper注解导致接口根本未被扫描。典型错误日志Field userMapper in com.example.service.impl.UserServiceImpl required a bean of type com.example.mapper.UserMapper that could not be found.触发场景项目结构重组后新建了一个新模块或新包下的Mapper。2.2.2 多模块项目结构问题在Maven或Gradle的多模块项目中问题会变得更加隐蔽。MapperScan注解通常放在启动类Application类所在的模块。如果Mapper接口定义在另一个子模块如domain或mapper模块而启动模块的依赖没有正确配置或者扫描路径指向了错误的模块就会导致扫描失败。典型表象项目能正常编译但一启动就报错。检查依赖和包名似乎都没问题。触发场景多模块项目中新添加了一个包含Mapper的模块。2.2.3 注解冲突或缺失冲突错误地同时使用了Repository和Mapper。对于MyBatis/MPMapper是标识接口为MyBatis映射器的核心注解。虽然Repository是Spring的持久层注解但仅加Repository而不加MapperMP是无法识别的。反之如果MP扫描正常工作Mapper已足够额外的Repository可能引起一些组件扫描的歧义尽管通常不致命。缺失如果依赖了MapperScan接口上可以不加Mapper。但如果没配置MapperScan接口上就必须加Mapper。两者全无必定找不到。2.2.4 构建与打包问题这是最狡猾的一类问题本地开发环境运行良好一到测试或生产环境就出错。资源过滤Maven或Gradle构建时默认可能不会将src/main/java目录下的.xml文件复制到target/classes或构建产物中。如果你的MyBatis使用的是XML映射文件尽管MP推荐使用注解但复杂SQL仍可能用XML且这些XML文件放在和Mapper接口同包的java目录下就会导致运行时找不到XML文件进而使得整个Mapper注册失败。打包插件配置SpringBoot的打包插件如spring-boot-maven-plugin有特定的打包规则如果配置不当可能导致类或资源文件丢失。2.2.5 动态数据源或特殊配置干扰当项目配置了多数据源并且使用了例如DS注解进行动态数据源切换时如果数据源配置不正确也可能导致某个Mapper在特定的数据源上下文初始化失败。此外一些自定义的MyBatis配置如SqlSessionFactoryBean如果覆盖了SpringBoot的自动配置且配置有误也会影响Mapper扫描。3. 系统化排查流程与实操要点遇到问题不要慌按照以下步骤进行系统化排查可以高效定位问题根源。3.1 第一步确认错误发生的具体阶段首先要分清错误是在项目启动时发生的还是在运行单元测试时发生的。两者的排查侧重点略有不同。启动时报错问题通常出在全局配置、组件扫描或Bean创建阶段。重点检查启动类、配置类、包结构。单元测试时报错问题可能出在测试环境的特定配置。重点检查测试类上的SpringBootTest注解是否指定了正确的启动类以及测试配置是否与主配置一致。3.2 第二步检查注解与扫描配置本地开发首要检查点定位启动类找到你的SpringBootApplication启动类。检查MapperScan如果使用了MapperScan检查其basePackages或value值。确保这个路径能覆盖所有Mapper接口所在的包。一个简单的验证方法是确保Mapper接口的全限定名如com.example.business.mapper.UserMapper是以你配置的扫描包路径如com.example.business.mapper开头的。可以使用通配符或多路径例如MapperScan({com.example.module1.mapper, com.example.module2.mapper})检查Mapper接口如果没有使用MapperScan那么每一个Mapper接口上都必须有Mapper注解。如果使用了MapperScanMapper接口上的Mapper注解是可选的但建议保留以增加可读性。避免注解堆砌在Mapper接口上使用Mapper足矣。除非有特殊理由否则不要额外添加Repository或Component。实操心得我习惯在启动类上使用MapperScan明确指定扫描的根包例如公司域名的根包这样即使以后Mapper接口分散在不同的子模块中只要它们都在这个根包下就都能被扫描到一劳永逸。同时在每个Mapper接口上保留Mapper注解作为“这是一个MyBatis Mapper”的清晰标识。3.3 第三步审视项目结构与依赖多模块项目杀手这是解决多模块项目问题的关键。检查模块依赖确保启动模块的pom.xml或build.gradle中已经正确依赖了定义Mapper接口的模块。光有代码引用是不够的必须在构建工具中声明依赖。检查包名一致性MapperScan中配置的包路径必须与Mapper接口在编译后类路径中的实际包名一致。有时子模块的groupId或artifactId会影响最终的包结构要仔细核对。查看编译输出执行mvn clean compile或项目构建后去target/classes目录下查看对应的Mapper接口的.class文件是否被正确生成在了预期的包路径下。这是最直接的证据。3.4 第四步核查XML映射文件与构建配置部署环境问题之源如果你的项目使用了XML文件来编写SQL映射这一步至关重要。检查XML文件位置传统的MyBatis喜欢将UserMapper.xml放在src/main/resources下与Mapper接口同名的目录结构中如resources/com/example/mapper/UserMapper.xml。这是最安全的位置因为资源目录下的文件默认都会被复制到类路径。警惕“同包存放”的陷阱MP允许将XML文件放在和Mapper接口相同的java目录下例如src/main/java/com/example/mapper/UserMapper.java旁边放UserMapper.xml。但这需要Maven/Gradle的额外配置。配置Maven资源过滤如果你坚持将XML放在src/main/java目录下必须在pom.xml的build节点中添加如下配置确保.xml文件会被当作资源处理并复制build resources resource directorysrc/main/java/directory includes include**/*.xml/include /includes filteringfalse/filtering /resource !-- 保留默认的资源目录扫描 -- resource directorysrc/main/resources/directory /resource /resources /build检查打包结果运行mvn clean package后解压生成的jar包或查看target/classes确认.class文件和.xml文件都存在于正确的类路径位置。3.5 第五步利用IDE工具与Spring Boot Actuator进行诊断IDE的Spring Bean查看功能IntelliJ IDEA Ultimate版或Spring Tools Suite等IDE提供了查看Spring应用上下文中所有Bean的功能。启动应用后查看是否包含了你的XXXXMapperBean。如果没有直接证实了扫描失败。检查启动日志SpringBoot启动时会打印大量的自动配置日志。搜索 “MapperScannerConfigurer” 或你配置的扫描包路径看是否有相关的扫描日志。如果完全没有说明扫描配置未生效。使用/actuator/beans端点如果已启用在application.yml中启用management.endpoints.web.exposure.includebeans启动后访问http://localhost:8080/actuator/beans可以以JSON形式查看容器中所有Bean的定义这是最权威的验证手段。4. 针对不同场景的解决方案实录下面我将结合几个最常见的具体场景给出详细的解决方案和配置示例。4.1 场景一单模块项目Mapper扫描失败问题描述在一个标准的SpringBoot单模块项目中UserService注入UserMapper失败。解决方案与步骤方案A使用MapperScan推荐在启动类上添加注解指定Mapper接口所在的包。import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; SpringBootApplication MapperScan(com.yourcompany.yourproject.mapper) // 替换为你的Mapper包路径 public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }同时确保你的UserMapper接口位于com.yourcompany.yourproject.mapper包或其子包下。方案B为每个Mapper接口添加Mapper如果不想用MapperScan可以在每个Mapper接口上单独添加Mapper注解。import org.apache.ibatis.annotations.Mapper; Mapper // 关键注解 public interface UserMapper extends BaseMapperUser { // ... your methods }注意事项在小型项目中方案B尚可接受。但在中大型项目中Mapper接口数量众多使用方案A的MapperScan更为简洁和集中是更优实践。4.2 场景二多模块项目中Mapper无法被扫描项目结构parent-project ├── pom.xml ├── application (启动模块) │ ├── src/main/java │ │ └── com/example/Application.java (启动类在这里) │ └── pom.xml └── domain (领域模块包含Mapper) ├── src/main/java │ └── com/example/domain/mapper/UserMapper.java └── pom.xml问题启动类在application模块Mapper在domain模块启动报错找不到UserMapper。解决方案与步骤确保依赖在application模块的pom.xml中必须依赖domain模块。!-- application/pom.xml -- dependencies dependency groupIdcom.example/groupId artifactIddomain/artifactId version${project.version}/version /dependency !-- ... other dependencies ... -- /dependencies配置全局扫描在application模块的启动类上MapperScan的包路径必须能覆盖domain模块中Mapper的包。// Application.java in application module SpringBootApplication MapperScan(com.example.domain.mapper) // 精确扫描domain模块的mapper包 // 或者扫描更通用的根包MapperScan(com.example) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }验证类路径构建项目后检查application/target/classes或打包后的jar中是否存在com/example/domain/mapper/UserMapper.class文件。这是最终检验依赖和扫描是否生效的金标准。4.3 场景三XML映射文件丢失导致Mapper注册失败问题描述项目使用了XML编写复杂SQL本地运行正常但用mvn clean package打包成jar后运行报错找不到Mapper或执行XML中的SQL时抛出Invalid bound statement (not found)异常。解决方案与步骤推荐将XML文件放在resources目录这是最不容易出错的方式。在src/main/resources下创建与Mapper接口包名相同的目录结构然后放入XML文件。src/main/resources/com/example/mapper/UserMapper.xml如需放在java目录配置Maven资源过滤如果你坚持将XML与Java接口放在一起必须按前述方法配置pom.xml的resources部分。在application.yml中显式指定XML位置可选但有时必要如果你的XML文件位置比较特殊可以在配置文件中告诉MyBatis去哪找。mybatis-plus: mapper-locations: classpath*:mapper/**/*.xml # 或者更精确的路径classpath*:com/example/**/mapper/*.xmlclasspath*:前缀表示从所有类路径包括依赖的jar包中搜索这对于多模块项目尤其有用。验证打包结果这是最关键的一步。不要假设要验证。# 打包 mvn clean package # 查看jar包内容 jar tf target/your-app.jar | grep UserMapper你应该能看到类似BOOT-INF/classes/com/example/mapper/UserMapper.class和BOOT-INF/classes/com/example/mapper/UserMapper.xml的输出。如果只有.class没有.xml说明资源过滤配置失败了。5. 进阶问题与排查技巧5.1 动态数据源配置下的Mapper扫描问题当使用多数据源并手动配置多个SqlSessionFactory和MapperScannerConfigurer时问题会变得复杂。关键点每个MapperScannerConfigurer必须指定其对应的SqlSessionFactoryBeanName和独立的basePackage。确保你的Mapper接口所在的包被正确的MapperScannerConfigurer扫描并且关联到了正确的SqlSessionFactory。常见错误配置了多数据源但MapperScan还是用的全局默认配置导致Mapper只在一个数据源下被注册而其他数据源对应的Service去注入时找不到Bean。解决方案为每个数据源创建独立的配置类并在每个配置类上使用MapperScan同时指定sqlSessionFactoryRef。Configuration MapperScan(basePackages com.example.mapper.db1, sqlSessionFactoryRef db1SqlSessionFactory) public class Db1DataSourceConfig { // ... 配置 db1 的 DataSource, SqlSessionFactory } Configuration MapperScan(basePackages com.example.mapper.db2, sqlSessionFactoryRef db2SqlSessionFactory) public class Db2DataSourceConfig { // ... 配置 db2 的 DataSource, SqlSessionFactory }然后将不同数据源的Mapper接口分别放在com.example.mapper.db1和com.example.mapper.db2包下。5.2 单元测试中的特殊问题在单元测试中SpringBootTest默认会加载整个应用上下文。但如果你的测试类不在主启动类的同级或子包下可能需要指定启动类。SpringBootTest(classes YourApplication.class) // 显式指定启动类 class UserServiceTest { Autowired private UserMapper userMapper; // 如果测试类包路径未被扫描这里可能注入失败 // ... }更常见的做法是将测试类放在与主启动类相同的包或其子包下这样SpringBoot的组件扫描就能自然覆盖到。5.3 使用ComponentScan导致的冲突如果你在配置类上使用了ComponentScan并自定义了扫描路径务必注意它可能会覆盖SpringBoot的默认扫描行为。确保你的自定义扫描路径包含了启动类所在的包以及你配置的MapperScan的包。一个混乱的ComponentScan配置是许多扫描问题的元凶。建议除非有充分理由否则不要轻易在SpringBoot项目中添加全局的ComponentScan。SpringBoot的SpringBootApplication已经包含了它并且其扫描规则通常是智能且足够的。6. 总结与核心检查清单当你再次面对 “XXXXMapperthat could not be found” 时不要盲目搜索请按顺序核对这份清单启动类/配置类是否有MapperScan其basePackages是否确实包含了目标Mapper接口的包Mapper接口本身如果没有MapperScan接口上是否有Mapper注解项目结构多模块启动模块是否正确依赖了包含Mapper接口的模块XML文件如果使用位置在哪resources目录下最安全pom.xml中是否配置了资源过滤如果XML在java目录application.yml中的mybatis-plus.mapper-locations配置是否正确构建结果执行mvn clean compile后去target/classes下看一眼.class和.xml文件是否在预期位置这是终极验证。特殊配置是否使用了多数据源动态数据源自定义了SqlSessionFactory检查这些配置是否干扰了默认的Mapper扫描注册流程。测试环境如果是单元测试报错检查测试类的SpringBootTest注解和包位置。从我处理这个问题的经验来看90%的情况都出在前三项扫描路径不对、注解没加、多模块依赖缺失。剩下的10%里又有9%是XML资源过滤问题。真正遇到动态数据源等复杂配置冲突的情况并不多。所以下次遇到这个问题深呼吸从第一项开始核对你很快就能找到那只捣乱的“虫子”。

相关新闻

GM8773 MIPI DSI桥接芯片:双屏显示硬件设计与驱动调试全解析

GM8773 MIPI DSI桥接芯片:双屏显示硬件设计与驱动调试全解析

2026/8/7 5:02:29

1. 项目概述:当一块屏不够时,GM8773如何成为显示扩展的“中枢神经”在嵌入式显示和消费电子领域,我们常常会遇到一个经典难题:主控芯片的MIPI DSI输出通道有限,但产品设计却需要驱动两块甚至更多的高分辨率显示屏。无论…

去耦电容设计全解析:从原理到实战,解决电源噪声与系统稳定性问题

去耦电容设计全解析:从原理到实战,解决电源噪声与系统稳定性问题

2026/8/7 5:02:29

1. 项目概述:从“玄学”到“科学”的电源稳定基石 如果你玩过音响,可能听过老烧们讨论“换电容如换机”,觉得有点玄乎。如果你画过电路板,可能遇到过芯片莫名其妙复位、ADC采样值跳动、音频输出有杂音,折腾半天最后发现…

抢先体验 DeltaDB:实时记录进展,让代码编辑与讨论追溯更便捷!

抢先体验 DeltaDB:实时记录进展,让代码编辑与讨论追溯更便捷!

2026/8/7 5:02:29

DeltaDB:版本控制新利器,功能亮点多DeltaDB 作为一款版本控制系统,能实时记录工作进展,并将每一处变更与促成该变更的讨论关联起来。它具备随时回溯编辑记录的能力,会捕捉每次提交之间的所有操作,并为每个操…

炉石传说模改插件:三分钟打造你的个性化游戏体验

炉石传说模改插件:三分钟打造你的个性化游戏体验

2026/8/7 23:43:19

炉石传说模改插件:三分钟打造你的个性化游戏体验 【免费下载链接】HsMod Hearthstone Modification Based on BepInEx 项目地址: https://gitcode.com/GitHub_Trending/hs/HsMod 你是否厌倦了炉石传说中漫长的开包动画?是否想要更高效地完成日常任…

斐波那契数列的矩阵解法与工程实战:从《算法之书》到万亿级大数计算

斐波那契数列的矩阵解法与工程实战:从《算法之书》到万亿级大数计算

2026/8/7 23:43:19

前言:公元1202年,意大利数学家斐波那契在《算法之书》中提出了著名的兔子繁殖问题。也许大家在初学编程时都曾写过求斐波那契数列的 for 循环。然而,当问题规模从第 10 项变成第 10 18 10^{18} 1018

养基宝APP request-sign算法分析

养基宝APP request-sign算法分析

2026/8/7 23:43:19

声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口 等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 有相关问题请第一时间点击头像看简介或…

Wireshark网络取证分析实战:从attack.pcapng流量包还原攻击链

Wireshark网络取证分析实战:从attack.pcapng流量包还原攻击链

2026/8/7 23:43:19

1. 从一份可疑的流量包说起:为什么我们需要Wireshark最近在复盘一个内部安全演练的案例,手头拿到了一份名为attack.pcapng的流量包文件。对于安全工程师、网络管理员,甚至是开发人员来说,面对一个未知的、可能包含攻击痕迹的流量包…

Python Selenium绕过Cloudflare人机验证:从指纹伪装到行为模拟的实战指南

Python Selenium绕过Cloudflare人机验证:从指纹伪装到行为模拟的实战指南

2026/8/7 23:43:19

1. 项目概述:当自动化脚本遭遇“人机验证”高墙如果你用Python的Selenium库写过网页自动化脚本,尤其是数据采集类的,大概率见过这个熟悉的页面:“请确认你是不是机器人”,或者更直白地告诉你“正在验证浏览器环境”。这…

electron-window-state与屏幕适配:跨显示器场景的完美解决方案

electron-window-state与屏幕适配:跨显示器场景的完美解决方案

2026/8/7 23:33:18

electron-window-state与屏幕适配:跨显示器场景的完美解决方案 【免费下载链接】electron-window-state A library to store and restore window sizes and positions for your Electron app 项目地址: https://gitcode.com/gh_mirrors/el/electron-window-state …

ncmdumpGUI:一键解锁网易云音乐ncm文件的终极解决方案

ncmdumpGUI:一键解锁网易云音乐ncm文件的终极解决方案

2026/8/6 19:19:00

ncmdumpGUI:一键解锁网易云音乐ncm文件的终极解决方案 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾经从网易云音乐下载了心爱的歌曲&am…

分布式配置中心选型实战:Nacos与Consul在创业场景下的对比

分布式配置中心选型实战:Nacos与Consul在创业场景下的对比

2026/8/5 6:02:27

分布式配置中心选型实战:Nacos与Consul在创业场景下的对比工程导读:本文深入讨论 分布式配置中心选型实战:Nacos与Consul在创业场景下的对比 在生产工程实践中的核心落地方案。基于 分布式架构与微服务设计 视角,剖析实际痛点、架…

MoneyPrinterPlus实战指南:AI视频批量生成与自动化发布完整解决方案

MoneyPrinterPlus实战指南:AI视频批量生成与自动化发布完整解决方案

2026/8/5 8:19:55

MoneyPrinterPlus实战指南:AI视频批量生成与自动化发布完整解决方案 【免费下载链接】MoneyPrinterPlus AI一键批量生成各类短视频,自动批量混剪短视频,自动把视频发布到抖音,快手,小红书,视频号上,赚钱从来没有这么容易过! 支持本地语音模型chatTTS,fasterwhisper,…

CAD图库管理:从文件归档到设计资产管理的效率革命

CAD图库管理:从文件归档到设计资产管理的效率革命

2026/8/7 0:02:15

你肯定遇到过这种情况:打开一个老项目,想找某个特定的图块——比如一个标准的门、一个特定的设备符号,或者一个公司logo。你记得它就在某个DWG文件里,或者曾经从某个同事那里拷来过。于是,你开始在一堆命名混乱的文件夹…

5分钟掌握Wand-Enhancer:2026年终极WeMod专业版免费解锁指南

5分钟掌握Wand-Enhancer:2026年终极WeMod专业版免费解锁指南

2026/8/7 0:02:15

5分钟掌握Wand-Enhancer:2026年终极WeMod专业版免费解锁指南 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer Wand-Enhancer是一款功能强…

“Quality Control(质量控制)”在软件工程中通常指通过一系列活动确保软件产品符合预定的质量标准和用户需求

“Quality Control(质量控制)”在软件工程中通常指通过一系列活动确保软件产品符合预定的质量标准和用户需求

2026/8/7 0:02:15

“Quality Control(质量控制)”在软件工程中通常指通过一系列活动确保软件产品符合预定的质量标准和用户需求。而“软件测试”是质量控制的关键手段之一,属于QC范畴下的具体实践,其目标是发现缺陷、验证功能正确性、评估软件质量属…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/6 5:43:30

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/7 8:02:42

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/4 15:11:03

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…