概述
交友项目的代码在写完之前,先要保证两件事:本机有一套能编译 JDK 8 工程的 Java 工具链,虚拟机里有一套能连上的中间件。这两样缺一个,app-server 都起不来。这篇把要装的东西、每项怎么配、装完怎么验证,一次说清。
纲要
- 环境清单:JDK、Maven、IDEA、中间件、模拟器、Postman 各自要什么版本、怎么验证
- 后端工具链安装:JDK 8 为什么锁 8、Maven 独立安装与 settings.xml、IDEA 三个必要配置
- Lombok 插件:不装会满屏红波浪但能编译的原因
- Maven 常见配置项:镜像、编译插件、编码(对照工程父 pom 实读结果)
- 工程导入与首次构建:多模块
mvn clean install的必要性,install与package的区别 - 中间件环境:VMware 挂载 CentOS7 镜像 + VMnet8 网段 + docker-compose 三类组件
- 客户端与接口工具:网易 MuMu 模拟器 + 项目 APK、Postman
- 环境就绪验证清单、常见问题速查表、常见误解澄清
环境清单
整体安装顺序如下,本机工具链和虚拟机中间件互不依赖,可以并行准备:
#mermaid-svg-56EpZ3iR2aPID8sz{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-56EpZ3iR2aPID8sz .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-56EpZ3iR2aPID8sz .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-56EpZ3iR2aPID8sz .error-icon{fill:#552222;}#mermaid-svg-56EpZ3iR2aPID8sz .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-56EpZ3iR2aPID8sz .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-56EpZ3iR2aPID8sz .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-56EpZ3iR2aPID8sz .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-56EpZ3iR2aPID8sz .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-56EpZ3iR2aPID8sz .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-56EpZ3iR2aPID8sz .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-56EpZ3iR2aPID8sz .marker{fill:#333333;stroke:#333333;}#mermaid-svg-56EpZ3iR2aPID8sz .marker.cross{stroke:#333333;}#mermaid-svg-56EpZ3iR2aPID8sz svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-56EpZ3iR2aPID8sz p{margin:0;}#mermaid-svg-56EpZ3iR2aPID8sz .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-56EpZ3iR2aPID8sz .cluster-label text{fill:#333;}#mermaid-svg-56EpZ3iR2aPID8sz .cluster-label span{color:#333;}#mermaid-svg-56EpZ3iR2aPID8sz .cluster-label span p{background-color:transparent;}#mermaid-svg-56EpZ3iR2aPID8sz .label text,#mermaid-svg-56EpZ3iR2aPID8sz span{fill:#333;color:#333;}#mermaid-svg-56EpZ3iR2aPID8sz .node rect,#mermaid-svg-56EpZ3iR2aPID8sz .node circle,#mermaid-svg-56EpZ3iR2aPID8sz .node ellipse,#mermaid-svg-56EpZ3iR2aPID8sz .node polygon,#mermaid-svg-56EpZ3iR2aPID8sz .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-56EpZ3iR2aPID8sz .rough-node .label text,#mermaid-svg-56EpZ3iR2aPID8sz .node .label text,#mermaid-svg-56EpZ3iR2aPID8sz .image-shape .label,#mermaid-svg-56EpZ3iR2aPID8sz .icon-shape .label{text-anchor:middle;}#mermaid-svg-56EpZ3iR2aPID8sz .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-56EpZ3iR2aPID8sz .rough-node .label,#mermaid-svg-56EpZ3iR2aPID8sz .node .label,#mermaid-svg-56EpZ3iR2aPID8sz .image-shape .label,#mermaid-svg-56EpZ3iR2aPID8sz .icon-shape .label{text-align:center;}#mermaid-svg-56EpZ3iR2aPID8sz .node.clickable{cursor:pointer;}#mermaid-svg-56EpZ3iR2aPID8sz .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-56EpZ3iR2aPID8sz .arrowheadPath{fill:#333333;}#mermaid-svg-56EpZ3iR2aPID8sz .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-56EpZ3iR2aPID8sz .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-56EpZ3iR2aPID8sz .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-56EpZ3iR2aPID8sz .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-56EpZ3iR2aPID8sz .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-56EpZ3iR2aPID8sz .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-56EpZ3iR2aPID8sz .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-56EpZ3iR2aPID8sz .cluster text{fill:#333;}#mermaid-svg-56EpZ3iR2aPID8sz .cluster span{color:#333;}#mermaid-svg-56EpZ3iR2aPID8sz div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-56EpZ3iR2aPID8sz .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-56EpZ3iR2aPID8sz rect.text{fill:none;stroke-width:0;}#mermaid-svg-56EpZ3iR2aPID8sz .icon-shape,#mermaid-svg-56EpZ3iR2aPID8sz .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-56EpZ3iR2aPID8sz .icon-shape p,#mermaid-svg-56EpZ3iR2aPID8sz .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-56EpZ3iR2aPID8sz .icon-shape .label rect,#mermaid-svg-56EpZ3iR2aPID8sz .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-56EpZ3iR2aPID8sz .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-56EpZ3iR2aPID8sz .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-56EpZ3iR2aPID8sz :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 全绿
有红项
JDK 8
java -version
Maven 3.6+
配 settings.xml 镜像
IDEA
Maven / 编码 / SDK 三项
装 Lombok 插件
开启注解处理
导入工程
mvn clean install
VMware 挂载 CentOS7
VMnet8 = 192.168.136.0
FinalShell 登录
192.168.136.160
docker-compose up -d
base / fastDFS / RMQ
环境就绪校验
开始写代码
查常见问题速查表
先把要装的东西摊开。交友项目跑通至少需要下面这些,装完照着「验证命令」确认一遍再往下走。
| 项目 | 版本要求 | 用途 | 怎么验证装了没 |
|---|---|---|---|
| JDK | 8(1.8) | 编译运行全部模块 | 终端执行 java -version,输出含 1.8.0_xxx |
| Maven | 3.6+ | 依赖管理与多模块构建 | 终端执行 mvn -v,能看到 Maven 与 Java 版本 |
| IntelliJ IDEA | 2020.3 及以上 | 编写与运行工程 | 能打开 pom.xml 并识别为 Maven 工程 |
| Lombok 插件 | 随 IDEA 版本匹配 | 实体类 @Data 语法增强 |
Settings → Plugins 里 Lombok 为已启用 |
| MySQL | 5.7 | 用户、动态等关系型数据 | mysql -uroot -p 能连上 |
| MongoDB | 4.0+ | 海量动态、日志存储 | mongo --host 192.168.136.160 能连上 |
| Redis | 5.x | 验证码、Token 缓存 | redis-cli -h 192.168.136.160 -p 6379 返回 PONG |
| Nacos | 1.4.x | 注册中心 / 配置中心 | 浏览器打开 http://192.168.136.160:8848/nacos |
| RabbitMQ | 3.8+ | 消息中间件(后续章节用) | 浏览器打开 http://192.168.136.160:15672 |
| VMware + CentOS7 镜像 | 15.x+ | 承载全部中间件容器 | FinalShell 能 SSH 登录 192.168.136.160 |
| Docker / docker-compose | 镜像内已装 | 批量管理中间件容器 | 虚拟机内执行 docker ps 有输出 |
| 网易 MuMu 模拟器 | 最新版 | 运行项目 APK 做联调 | 模拟器内能打开交友 App |
| Postman | 6.0.10(资料自带) | 后端接口自测 | 能对 http://www.baidu.cn 发出 GET 并收到响应 |
中间件的安装方式这里不逐个展开------镜像里全部以 Docker 容器跑,本地只需起虚拟机。镜像导入、端口、账号在本文「中间件环境」一节给出。
为什么 JDK 锁 8
工程父 pom 里 <parent> 引的是 spring-boot-starter-parent 2.3.9.RELEASE,dependencyManagement 里 Spring Cloud 是 Hoxton.SR10、Spring Cloud Alibaba 是 2.2.5.RELEASE。这一套依赖代际是 2020 年前后的组合,整条生态链在 JDK 8 上验证最充分。
换到 JDK 11 或更高,常见两类问题:一是部分老版本字节码增强库(如早期 Lombok 1.18.8)在新 JDK 上抛 Unsupported class file major version;二是 JDK 9 引入的模块化会让某些反射、sun.misc.* 调用直接失败。项目里 lombok.version 写死 1.18.8,就是为了兼容 JDK 8。
结论很直接:本机装 JDK 8,IDEA 的 Project SDK 也选 8。别用高版本去"顺手升级"。
Maven 与 IDEA 的安装与配置
Maven:独立安装,别依赖 IDEA 内置
IDEA 自带一套 Maven(Bundled),能用,但有两个坑:一是它默认把本地仓库放在 ~/.m2/repository,和独立安装的 Maven 不是同一个仓库,来回切换会导致依赖重复下载甚至"刚下好又找不到";二是自带版本往往没有配国内镜像,包体几百 MB 的依赖从中央仓库拉,第一次构建能耗掉几十分钟,超时失败很常见。
所以建议独立装一份 Maven,然后在 IDEA 里指过去。配置的落点是 settings.xml(位于 Maven安装目录/conf/settings.xml 或 ~/.m2/settings.xml)。
镜像配置,加在 <mirrors> 里:
xml
<mirrors>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>
<mirrorOf>*</mirrorOf> 表示拦截所有仓库请求。如果只想代理中央仓库,改成 <mirrorOf>central</mirrorOf>。
本地仓库位置,加在 <localRepository>:
xml
<settings>
<localRepository>D:/maven/repository</localRepository>
</settings>
路径别带空格和中文,Windows 下尤其要避开 C:/Program Files。
IDEA 的三个必要配置
Maven 配置 。路径 File → Settings → Build, Execution, Deployment → Build Tools → Maven。三处要改:
Maven home path:指向独立安装的 Maven 目录,不用Bundled (Maven 3)User settings file:指向上面那份settings.xml,勾上OverrideLocal repository:确认与settings.xml里的一致
改完点 Apply。这里最容易出的问题是只改了 home path 没改 settings.xml,镜像根本没生效,依赖还是从中央仓库拉。
编码配置 。路径 File → Settings → Editor → File Encodings。三处全部设为 UTF-8:
Global Encoding(IDE Encoding)Project EncodingDefault encoding for properties files
properties 文件历史默认是 ISO-8859-1,中文字符串会变问号或乱码,所以第三项单独列出来必须改。
光设 IDE 还不够------Java 编译时的字符集 由 JVM 参数决定。Windows 上命令行默认编码是 GBK,javac 读源文件时会按平台编码解析,中文字符串常量就会乱码。工程父 pom 的编译插件里已经带了 <encoding>UTF-8</encoding>(见下节),但如果你用 IDEA 的 VM options 手动编译,需要显式加:
text
-Dfile.encoding=UTF-8
位置:Run → Edit Configurations → VM options,或 Help → Edit Custom VM Options 加到 IDEA 全局。
JDK 配置 。路径 File → Project Structure → Project。两项都要是 8:
Project SDK:选本机装的 JDK 1.8Project language level:选8 - Lambdas, type annotations etc.
这两项必须一致。只改 SDK 不改 Language Level,IDEA 仍按高版本语法检查,会报 无效的目标发行版: 1.8 或反向的语法不兼容错误------新手最常见的编译坑之一。
Lombok:插件不装必踩坑
交友项目的实体类、DTO 大量使用 Lombok 的 @Data、@Slf4j。Lombok 的工作方式是"编译期生成 getter/setter/构造器",JDK 的 javac 通过注解处理器认识它,但 IDEA 的编辑器语法分析不认,除非装 Lombok 插件。
不装的典型现象:IDEA 里实体类满屏红色波浪线,提示 Cannot resolve method 'getXxx',可 mvn compile 却成功。别去改代码,是插件没装。
安装路径:File → Settings → Plugins → Marketplace,搜 Lombok,安装后重启 IDEA。新版 IDEA 2020.3+ 已默认内置,老版本需要手动装。
装完还要在 Settings → Build, Execution, Deployment → Compiler → Annotation Processors 勾上 Enable annotation processing,否则编译期也不生成代码。
Maven 常见配置项(对照工程实读)
下面是交友项目父 pom(mf/pom.xml)里与环境相关的配置。实读结论:工程已经配好,一般不用改,直接照抄理解即可。
编码与编译版本写在 <properties>:
xml
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<lombok.version>1.18.8</lombok.version>
<mysql.version>5.1.47</mysql.version>
<mongo.version>4.0.5</mongo.version>
<spring-cloud.version>Hoxton.SR10</spring-cloud.version>
<spring-cloud-alibaba.version>2.2.5.RELEASE</spring-cloud-alibaba.version>
</properties>
编译插件在 <build><plugins> 里,负责源码级 1.8 与 UTF-8:
xml
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
注意父 pom 里没有镜像配置------镜像属于本机环境,写在 settings.xml,不写进工程。这个分工要分清,否则把镜像塞进 pom 会污染团队工程。
如果某个工程 pom 里没有 <encoding>,可以在 <properties> 里加一条通用的:
xml
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
导入工程与首次构建
导入 Maven 工程
两种方式,效果一样:
File → Open,直接选工程根目录下的pom.xml,IDEA 会识别为 Maven 工程- 或在欢迎页
Import Project选根目录,勾选Import project from external model → Maven
导入后 IDEA 会开始解析依赖。父工程 packaging 是 pom,五个子模块会一起被识别。
tree
mf
├── pom.xml # 父工程,packaging=pom,管理版本与通用依赖
├── mf-model # 实体类模块
├── mf-autoconfig # 自动装配组件(短信等)
├── mf-commons # 工具类
├── mf-app-server # 与手机端交互的入口(SpringBoot 启动模块)
└── mf-dubbo
├── pom.xml # Dubbo 子模块聚合
├── mf-dubbo-interface # Dubbo 接口(供 provider/consumer 共享)
├── mf-dubbo-db # Dubbo 服务实现(数据库)
└── mf-dubbo-mongo # Dubbo 服务实现(MongoDB)
首次必须 mvn clean install
多模块工程里,mf-model、mf-commons、mf-dubbo-interface 是公共模块,被其他模块以普通 Maven 依赖引用。IDEA 导入后只有把这些模块的构件装进本地仓库,下游模块才解析得到。
所以第一次拉下代码,在根目录执行:
bash
mvn clean install -DskipTests
-DskipTests 跳过单测,加快首次构建。装完再在 IDEA 里点运行。
不装公共模块直接跑 app-server,典型报错就是 找不到符号(编译期)或 Could not resolve dependencies for project ...: The following artifacts could not be resolved(解析期)。这类报错的根因不是代码错,是本地仓库里缺公共模块的 jar。
install 和 package 的区别要记牢:
| 命令 | 产物 | 是否装入本地仓库 | 用途 |
|---|---|---|---|
mvn package |
模块 target 下的 jar |
否 | 只打包当前模块,多模块互依时不顶用 |
mvn install |
同上,另复制 jar + pom 到 ~/.m2/repository |
是 | 让其他模块能引用当前模块 |
多模块项目改完公共模块的代码,必须重新 install,否则下游模块用的还是旧 jar。
依赖方向如下,箭头指到谁,谁就必须先 install 到本地仓库:
#mermaid-svg-rXlS0bOSEs9OYARu{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-rXlS0bOSEs9OYARu .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-rXlS0bOSEs9OYARu .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-rXlS0bOSEs9OYARu .error-icon{fill:#552222;}#mermaid-svg-rXlS0bOSEs9OYARu .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-rXlS0bOSEs9OYARu .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-rXlS0bOSEs9OYARu .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-rXlS0bOSEs9OYARu .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-rXlS0bOSEs9OYARu .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-rXlS0bOSEs9OYARu .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-rXlS0bOSEs9OYARu .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-rXlS0bOSEs9OYARu .marker{fill:#333333;stroke:#333333;}#mermaid-svg-rXlS0bOSEs9OYARu .marker.cross{stroke:#333333;}#mermaid-svg-rXlS0bOSEs9OYARu svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-rXlS0bOSEs9OYARu p{margin:0;}#mermaid-svg-rXlS0bOSEs9OYARu .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-rXlS0bOSEs9OYARu .cluster-label text{fill:#333;}#mermaid-svg-rXlS0bOSEs9OYARu .cluster-label span{color:#333;}#mermaid-svg-rXlS0bOSEs9OYARu .cluster-label span p{background-color:transparent;}#mermaid-svg-rXlS0bOSEs9OYARu .label text,#mermaid-svg-rXlS0bOSEs9OYARu span{fill:#333;color:#333;}#mermaid-svg-rXlS0bOSEs9OYARu .node rect,#mermaid-svg-rXlS0bOSEs9OYARu .node circle,#mermaid-svg-rXlS0bOSEs9OYARu .node ellipse,#mermaid-svg-rXlS0bOSEs9OYARu .node polygon,#mermaid-svg-rXlS0bOSEs9OYARu .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-rXlS0bOSEs9OYARu .rough-node .label text,#mermaid-svg-rXlS0bOSEs9OYARu .node .label text,#mermaid-svg-rXlS0bOSEs9OYARu .image-shape .label,#mermaid-svg-rXlS0bOSEs9OYARu .icon-shape .label{text-anchor:middle;}#mermaid-svg-rXlS0bOSEs9OYARu .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-rXlS0bOSEs9OYARu .rough-node .label,#mermaid-svg-rXlS0bOSEs9OYARu .node .label,#mermaid-svg-rXlS0bOSEs9OYARu .image-shape .label,#mermaid-svg-rXlS0bOSEs9OYARu .icon-shape .label{text-align:center;}#mermaid-svg-rXlS0bOSEs9OYARu .node.clickable{cursor:pointer;}#mermaid-svg-rXlS0bOSEs9OYARu .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-rXlS0bOSEs9OYARu .arrowheadPath{fill:#333333;}#mermaid-svg-rXlS0bOSEs9OYARu .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-rXlS0bOSEs9OYARu .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-rXlS0bOSEs9OYARu .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-rXlS0bOSEs9OYARu .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-rXlS0bOSEs9OYARu .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-rXlS0bOSEs9OYARu .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-rXlS0bOSEs9OYARu .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-rXlS0bOSEs9OYARu .cluster text{fill:#333;}#mermaid-svg-rXlS0bOSEs9OYARu .cluster span{color:#333;}#mermaid-svg-rXlS0bOSEs9OYARu div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-rXlS0bOSEs9OYARu .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-rXlS0bOSEs9OYARu rect.text{fill:none;stroke-width:0;}#mermaid-svg-rXlS0bOSEs9OYARu .icon-shape,#mermaid-svg-rXlS0bOSEs9OYARu .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-rXlS0bOSEs9OYARu .icon-shape p,#mermaid-svg-rXlS0bOSEs9OYARu .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-rXlS0bOSEs9OYARu .icon-shape .label rect,#mermaid-svg-rXlS0bOSEs9OYARu .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-rXlS0bOSEs9OYARu .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-rXlS0bOSEs9OYARu .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-rXlS0bOSEs9OYARu :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} mf-model
mf-commons
mf-dubbo-interface
mf-dubbo-db
mf-dubbo-mongo
mf-app-server
根目录一次 mvn clean install 会按这个顺序自动排好构建次序,不用手动一个个装。
中间件环境:虚拟机 + Docker Compose
中间件在镜像里全部以 Docker 容器运行,本地不用逐个装。步骤是导入镜像、改网段、用 docker-compose 起组件。
导入 CentOS7 镜像
资料里是已装好服务的 CentOS7 镜像压缩包(centos7-项目.vip 一类,含 .vmx 文件)。解压到无空格、无特殊字符的目录,然后:
- VMware 中
文件 → 打开,选解压出来的.vmx文件 - 右键虚拟机
设置,内存默认 4G,按本机情况调整 编辑 → 虚拟网络编辑器 → 更改设置,找到VMnet8,把子网改为192.168.136.0
第 3 步不能跳。镜像里各组件之间的连接地址钉死在 192.168.136.x 网段,网段不改,容器互访和外部访问都会出问题。
启动后用 FinalShell 连接:
| 项 | 值 |
|---|---|
| 主机 | 192.168.136.160 |
| 用户名 | root |
| 密码 | root123 |
能进 Shell,说明镜像挂载和网络都通了。
用 docker-compose 起组件
虚拟机的 /root/dockerfile 下按用途分了三类目录,每类里都有 docker-compose.yml:
tree
/root/dockerfile
├── base/docker-compose.yml # Redis、Nacos、MongoDB、YAPI
├── fastDFS/docker-compose.yml # FastDFS 分布式文件存储
└── RMQ/docker-compose.yml # RabbitMQ
进对应目录执行即可:
bash
cd /root/dockerfile/base
docker-compose up -d
-d 表示后台运行。启动后各组件访问地址:
| 组件 | 地址 | 备注 |
|---|---|---|
| Redis | 192.168.136.160:6379 | 常规用法 |
| MongoDB | 192.168.136.160:27017 | 无认证,直连 |
| Nacos | 192.168.136.160:8848/nacos | 浏览器可访问控制台 |
| YAPI | 192.168.136.160:3000 | 接口文档,首次访问 mf@mf / 123456 |
| FastDFS | 见该目录 compose | 后续章节用 |
| RabbitMQ | 见该目录 compose | 后续章节用 |
只要当天要写 app-server 的代码,开机后第一件事就是进虚拟机把 base 起起来。虚拟机重启后容器不会自动起,忘了这一步会看到应用连不上 Nacos、Redis 连接被拒。
客户端与接口工具
Android 模拟器与项目 APK
客户端由前端团队打包成 APK,本地用模拟器联调。推荐网易 MuMu(https://mumu.163.com/),兼容性较好;如果和当前系统冲突,换成夜神或雷电模拟器也可以。
资料里已带安装包 app-1104-真机.apk。安装步骤:模拟器里 更多 → 安装 APK → 选文件 → 等待安装完成,然后点图标打开验证。
打开后如果闪退,进 设置中心 → 高级 → 渲染模式,切成"极速"或"兼容",保存并关闭,重启模拟器再试。这类闪退多数是渲染模式与显卡驱动不匹配,换模式基本能解决。
Postman
Postman 用于后端自测,不必等客户端联调。资料里带 Postman-win64-6.0.10-Setup.exe,双击安装,首次打开注册登录即可。
界面操作三步:左侧下拉选请求方法(GET / POST / PUT...),中间填 URL,点 Send。响应在下方,HTML 返回的是片段,JSON 接口返回的就是结构化 JSON 数据。
试一下:方法 GET,URL http://www.mf.cn,Send 能看到响应。后续写登录、验证码接口时,就可以在这里手发请求,不必依赖模拟器。
环境就绪验证清单
装完逐项过一遍,全绿再开始写代码。
| 检查项 | 操作 | 预期输出 |
|---|---|---|
| JDK | java -version |
java version "1.8.0_xxx" |
| Maven | mvn -v |
Apache Maven 3.6.x + Java version: 1.8.0_xxx |
| IDEA SDK | Project Structure → Project | Project SDK = 1.8,Language Level = 8 |
| Lombok | Settings → Plugins | Lombok 已启用;Annotation Processors 已勾选 |
| 父工程构建 | 根目录 mvn clean install -DskipTests |
BUILD SUCCESS |
| 中间件 | 浏览器开 :8848/nacos |
进入 Nacos 控制台 |
| 模拟器 | 打开交友 App | 不闪退,进入登录页 |
| Postman | GET http://www.baidu.cn |
收到 HTML 响应 |
常见问题速查表
| 现象 | 原因 | 处理 |
|---|---|---|
| Maven 下载极慢或超时失败 | 未配镜像,走中央仓库 | settings.xml 加阿里云 <mirror> |
| IDEA 满屏红波浪,提示找不到 getter/setter | 未装 Lombok 插件 | 装插件 + 开启 Annotation Processing |
| 编译报"无效的目标发行版: 1.8" | Project SDK 与 Language Level 不一致 | 两者都设为 8 |
| 中文字符串 / 配置文件乱码 | 编码未统一 | File Encodings 三处设 UTF-8,编译加 -Dfile.encoding=UTF-8 |
Could not resolve dependencies / 找不到符号 |
公共模块未 install | 根目录 mvn clean install |
| 应用连不上 Nacos / Redis | 虚拟机容器未启动 | 进 base 目录 docker-compose up -d |
| 端口被占用(8848/6379 等) | 本机已装同名服务 | 停掉本机服务,或只保留虚拟机一套 |
| 交友 App 闪退 | 渲染模式与显卡不兼容 | 模拟器渲染模式切极速/兼容 |
常见误解澄清
"IDEA 自带 Maven 就够,不用单独装。" 能用,但默认仓库与镜像都不是你想要的那套。独立装一份并显式指定 settings.xml,省的是每次拉依赖的时间。
"JDK 版本越高越好。" 本项目锁 8。SpringBoot 2.3.9 + Spring Cloud Hoxton + Lombok 1.18.8 这一代依赖,在 JDK 11+ 上会遇到模块化和字节码版本的兼容问题,升级没有收益只有成本。
"Lombok 报错说明代码写错了。" 是插件没装,mvn compile 能过就说明代码没问题。
"导入工程后直接跑 app-server 就行。" 多模块工程必须先 install 公共模块,否则下游解析不到依赖。
"改完代码 IDEA 报错就是编译不过。" 先看 mvn compile 的结果,排除掉 IDE 插件层的假报错再定位。
下一篇进入「项目模块介绍」,逐个拆开上面这棵多模块树里每个工程负责什么。
官方文档
总结
装这套环境的顺序是:JDK 8 → Maven(含镜像) → IDEA(Maven / 编码 / SDK 三项配置) → Lombok 插件 → 导入工程 mvn clean install → 起虚拟机中间件 → 模拟器与 Postman。每一步都有对应的验证动作,别跳过验证直接写代码。
真正高频翻车的只有四处:镜像没配导致构建慢、Language Level 没跟 SDK 对齐、Lombok 插件没装、公共模块没 install。记住这四条,后面改代码会顺很多。