Java 项目实战: 交友项目 - 安装开发工具与环境准备

概述

交友项目的代码在写完之前,先要保证两件事:本机有一套能编译 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,勾上 Override
  • Local repository:确认与 settings.xml 里的一致

改完点 Apply。这里最容易出的问题是只改了 home path 没改 settings.xml,镜像根本没生效,依赖还是从中央仓库拉。

编码配置 。路径 File → Settings → Editor → File Encodings。三处全部设为 UTF-8:

  • Global Encoding(IDE Encoding)
  • Project Encoding
  • Default 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.8
  • Project 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 文件)。解压到无空格、无特殊字符的目录,然后:

  1. VMware 中 文件 → 打开,选解压出来的 .vmx 文件
  2. 右键虚拟机 设置,内存默认 4G,按本机情况调整
  3. 编辑 → 虚拟网络编辑器 → 更改设置,找到 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。记住这四条,后面改代码会顺很多。

相关推荐
用户21296835261684 小时前
开源了一个 Java 多智能体 LLM 框架 Baton:一个依赖,把 Agent 循环、工具调用、记忆、编排全配齐
java·llm
helmsail4 小时前
05 管理活动与选品
java
天远数科5 小时前
Java数据工程:利用天远人车核验加强版优化智慧高速ETC发行合规体验
java·人工智能
.Bryce.5 小时前
在智能体中使用A2A工具:让大模型自己决定“该找谁帮忙“
android·java·服务器·redis·后端·agent·a2a
xiaoqiMikko5 小时前
fastjson 1.2.84 的补丁关掉了一个缓存:addAccept 包前缀白名单下,反序列化慢了 13~28 倍
java·后端·性能优化
XIAEE5 小时前
转生到儿童编程异世界:我用 Vue 和 Scratch 建了一座 DREAM 学院
java·spring
XIAEE5 小时前
初次使用 Node + Koa + MongoDB 搭建服务器:从零到第一个 API
java·spring
m0_587383005 小时前
无人自助拼豆系统核心功能开发与部署落地全流程实战指南
java·经验分享·后端·struts·架构
雷一言说6 小时前
Spring AI 2.0:RAG 文档分块大小策略选择
java·spring