1. 课程导入与工程环境搭建
《Java核心工程与并发综合项目与工程实践》这门课的目标不是再讲一遍语法,而是把 Java 核心能力、并发编程与真实工程组织方式串成一条可交付的链路。学完之后,你应当能够独立搭建一个可编译、可测试、可打包、可协作的多模块 Java 工程,并在其中实现线程池、并发容器、锁与同步、异步任务编排等典型并发场景,最终形成一个结构清晰、依赖可控、可复现构建的综合项目。
本课程的技术栈选型围绕“稳定、主流、可验证”三个原则确定。JDK 选用 17(LTS),因为它既支持 records、sealed、switch 表达式等现代语法,又长期获得安全更新;构建工具使用 Maven 3.9.x,配合多模块聚合工程管理依赖与生命周期;测试框架使用 JUnit 5 与 AssertJ,便于对并发结果做断言;日志使用 SLF4J + Logback,避免直接依赖具体实现;并发部分以 JDK 自带的 java.util.concurrent 为核心,不引入额外并发库,确保原理可追溯。版本控制使用 Git,并约定主干开发与特性分支的基本规范。
工程结构采用 Maven 多模块聚合方式,这是本课程后续所有章节的物理载体。父工程只负责统一版本、依赖管理与插件配置,不写业务代码;子模块按职责拆分,避免一个模块既做工具又做业务。一个合理的初始结构如下:
concurrency-lab/
├── pom.xml # 父工程:packaging=pom,统一版本与依赖管理
├── lab-common/ # 通用工具、常量、结果封装
│ └── pom.xml
├── lab-concurrency/ # 并发核心:线程池、锁、同步器、并发容器
│ └── pom.xml
├── lab-service/ # 业务服务:任务编排、异步流程
│ └── pom.xml
└── lab-boot/ # 启动与集成测试入口
└── pom.xml
父工程 pom.xml 的关键配置是 <packaging>pom</packaging> 与 <modules> 列表,同时用 <dependencyManagement> 锁定 JUnit、SLF4J、Logback 的版本,子模块引用时不再写版本号,从而避免版本漂移。子模块之间通过 <dependency> 声明依赖,例如 lab-service 依赖 lab-concurrency,lab-boot 依赖 lab-service,形成单向依赖链,禁止循环依赖。
mvn -q dependency:tree,观察依赖树中是否出现同一构件多个版本,以及是否存在模块间反向依赖。若出现循环依赖,Maven 会在构建阶段直接报错,这是最早、最廉价的发现时机。IDEA 环境配置的重点不是“装好就行”,而是让 IDE 与 Maven 使用同一套 JDK 和同一份配置。导入工程时选择“Open”并指向父 pom.xml,IDEA 会自动识别聚合关系。随后在 Settings → Build Tools → Maven 中确认 Maven home、本地仓库路径与 settings.xml;在 Project Structure → Project 中把 SDK 设为 JDK 17,语言级别设为 17。编码统一为 UTF-8,避免中文注释在编译时乱码。开启注解处理器(如后续使用 Lombok 时)也在此处配置。
版本控制初始化应在第一次提交前完成,而不是写完代码再补。进入工程根目录执行:
git init
git branch -M main
# 创建 .gitignore,至少忽略 target/、.idea/、*.iml、*.log
git add .
git commit -m "chore: init multi-module maven skeleton"
.gitignore 中必须排除 target/ 与 IDE 个人配置,只提交 pom.xml、源码与必要资源。这样任何一位同学克隆后执行 mvn clean verify,都能得到一致的构建结果,而不是依赖某台机器上的本地状态。
下面这张图把本节的核心对象与关系集中呈现:左侧是技术栈选型,中间是多模块依赖链,右侧是环境与版本控制的关键动作。它不重复正文步骤,而是帮助你快速看清“选了什么、模块怎么连、环境怎么对齐”。
完成以上动作后,你可以用三个信号判断环境是否真正就绪:第一,mvn clean verify 在父工程目录执行成功,四个子模块依次构建且无循环依赖;第二,mvn -q dependency:tree 输出中同一构件只有一个版本;第三,在 IDEA 中新建一个测试类,能直接运行 JUnit 5 用例并通过。若其中任何一项失败,优先检查 JDK 版本、Maven 配置与模块依赖声明,而不是先写业务代码。
<packaging>pom</packaging>,子模块聚合会失败;子模块若各自写死依赖版本,后续升级会非常痛苦;.gitignore 若漏掉 target/,仓库会迅速膨胀且产生大量无意义冲突。本节交付的成果是一个可运行、可提交、可协作的工程骨架。它本身不含并发逻辑,但后续所有线程池、锁、同步器、异步编排的代码都会落在这个骨架上。请先确保骨架稳定,再进入并发核心内容,这样每一次实验都能被版本控制记录、被 Maven 复现、被测试验证。