步骤 1:使用 Spring Initializr 创建父项目
打开IntelliJ IDEA,选择 File > New > Project。
选择 Spring Initializr 并配置项目信息:
- Group ID:例如
com.aqian
,用于项目的组织标识。 - Artifact ID:例如
cangqiong
(即父项目名称),用于项目的唯一标识。 - Packaging:选择
pom
,确保父项目仅作为架构项目,无需生成src
文件夹。 - Java version:选择您项目所需的 Java 版本。
选择项目依赖:勾选所有子模块需要的公共依赖(例如 Spring Boot Web、Spring Data JPA、Spring Boot DevTools 等)。这样公共依赖会添加到父项目的 pom.xml
中,所有子模块均能继承。
点击 Finish,完成父项目的创建。
步骤 2:删除父项目中不需要的文件夹
删除自动生成的 src
文件夹,因为父项目不包含业务代码,仅用作管理。
.mvn/
+ mvnw
+ mvnw.cmd
是一套的:
它们是 Maven Wrapper 工具,用来:
保证团队中所有人用同一版本的 Maven 来构建项目,不用要求本地必须装 Maven。
父项目中需要保留的
文件/目录 | 作用 | 是否需要保留?(父项目) |
---|---|---|
.mvn/ | Maven wrapper 运行环境文件夹 | ✅ 建议保留 |
.idea/ | IDEA 的项目配置文件夹(工作区信息) | 🚫 建议 不加入版本控制 |
.gitignore | Git 忽略文件列表 | ✅ 一般要保留 |
mvnw , mvnw.cmd | Maven wrapper 脚本(用于执行项目时不依赖本机 Maven) | ✅ 建议保留 |
子项目中不需要保留的
文件/目录 | 子模块是否需要? |
---|---|
.mvn/ | ❌ 不需要 |
.idea/ | ❌ 不建议版本控制 |
mvnw / mvnw.cmd | ❌ 不需要 |
.gitignore | ⭕ 可选(一般只在父项目有就够) |
🚨 注意:
-
你只需要在父项目中维护 Maven Wrapper 和 GitIgnore 文件
-
子模块只需要目录结构 +
pom.xml
,不要加这些项目根配置
配置父项目 pom.xml
文件:确保 packaging
设置为 pom
,并在 <dependencyManagement>
中添加通用依赖。
<groupId>com.aqian</groupId>
<artifactId>biguo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<dependencyManagement>
<dependencies>
<!-- 父项目定义的公共依赖,子模块会自动继承 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- 可以添加其他所有子模块需要的依赖 -->
</dependencies>
</dependencyManagement>
<build>
<plugins>
<!-- Spring Boot 插件,用于运行和打包 Spring Boot 应用 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
如果你打算使用 Nacos 注册中心、Nacos 配置中心、Sentinel 等 Spring Cloud Alibaba 提供的组件,必须单独引入 Spring Cloud Alibaba 的依赖,因为这些组件并不包含在 Spring Cloud 官方的 starter 中。
<!-- Spring Cloud Alibaba BOM -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2022.0.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
步骤 3:为父项目添加子模块
右键父项目,选择 New > Module。
选择 Spring Initializr 作为模块类型,然后配置子模块信息:
- Group ID:与父项目相同,例如
com.aqian
。 - Artifact ID:例如
module1
(子模块名称)。 - 不勾选公共依赖(如 Spring Boot Web、Data JPA 等),因为这些依赖已经在父项目中配置。
完成创建后,IDEA会生成一个包含 src
文件夹和 pom.xml
的子模块。
步骤 4:配置子模块的application.properties
并 配置子模块的pom.xml
每个微服务是否需要设置不同端口?
- 是的,在开发环境中,每个微服务必须使用不同的端口,原因如下:
本地开发时:所有服务都运行在同一台机器上,必须通过不同端口区分
服务注册:Eureka/Nacos等注册中心需要知道每个服务的准确访问地址(IP+端口)
配置子模块的 pom.xml
:
- 在
<parent>
中设置子模块继承父项目配置,并删除<relativePath/>
标签,避免路径配置错误。- 删除
<build>
配置,使子模块直接使用父项目的构建配置,避免冗余。
示例子模块的 pom.xml
:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.aqian</groupId>
<artifactId>cangqiong</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.aqian</groupId>
<artifactId>module1</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<!-- 子模块特定的依赖(如果有)可以在这里添加 -->
</dependencies>
</project>
重复以上步骤,为其他模块创建并配置 pom.xml
,确保所有子模块继承父项目。
relativePath
默认值: 如果省略relativePath
,默认会向上查找父目录的pom.xml
。- 如果父项目和子项目不在同一物理目录结构下,可能需要手动设置
relativePath
。
步骤 5:在父项目 pom.xml
中添加 <modules> 并 修改父模块的
<packaging>
打开父项目的 pom.xml
文件,确保每个子模块都在 <modules>
标签中。如果没有自动添加,可以手动配置,如下所示:
<modules>
<module>module1</module>
<module>module2</module>
<!-- 其他子模块名称 -->
</modules>
父模块的 packaging
必须是 pom
类型
- 在 Maven 多模块项目中,父模块(Parent Module)本身通常不包含可执行代码或资源文件,而是用来聚合和管理子模块。
- 由于父模块仅作为容器管理子模块,它的
packaging
类型必须是pom
。
<groupId>com.aqian</groupId>
<artifactId>mychinchin</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging> <!-- 父模块必须是 pom -->
步骤 6:构建和测试项目
在Maven工具窗口(通常位于右侧)点击 Reload All Maven Projects,确保所有子模块和依赖加载到位。
使用 mvn install
命令:在父项目的根目录下运行 mvn install
命令,这会构建父项目及其所有子模块,并将生成的构建工件(如 .jar
文件)安装到本地Maven仓库。
mvn install
作用:
mvn install
命令会执行项目的完整构建流程,包括以下步骤:
通过 mvn install
,所有模块的 .jar
文件将会保存在本地仓库,便于子模块间的相互依赖和项目集成。
- 编译:将 Java 源代码编译成字节码(
.class
文件)。 - 测试:执行单元测试并生成测试报告。
- 打包:将编译和测试后的代码打包成
.jar
文件(或其他格式,取决于pom.xml
中的配置)。 - 安装:将打包生成的
.jar
文件安装到本地Maven仓库(默认路径为~/.m2/repository
),以便其他项目或模块可以引用这些构建工件。
公共模块(common-core
)被其他子模块引入的正确流程
(1)确保公共模块的 pom.xml
配置正确
-
设置打包方式为
jar
(默认就是jar
,但最好显式声明):<parent> <groupId>com.yourcompany</groupId> <artifactId>parent-project</artifactId> <version>1.0.0</version> </parent>
<packaging>jar</packaging>
打包方式:
jar
vspom
jar
(默认值)
用途:将模块编译为Java库(JAR文件),包含编译后的类文件、资源文件等。
典型场景:
公共工具模块(如
common-core
)。业务逻辑模块(需被其他模块依赖的代码)。
示例配置:
<packaging>jar</packaging> <!-- 默认值,可省略 -->
pom
用途:仅作为父模块或聚合模块,不生成实际的JAR/WAR文件,仅用于管理子模块或统一依赖版本。
典型场景:
多模块项目的根模块(父POM)。
BOM(Bill of Materials)项目,如Spring Cloud的依赖管理包。
示例配置:
<packaging>pom</packaging>
-
继承父模块(如果项目是多模块结构):
-
禁用
spring-boot-maven-plugin
(避免尝试打包成可执行 JAR):<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <skip>true</skip> <!-- 关键!禁用 repackage --> </configuration> </plugin> </plugins> </build>
(2) 构建公共模块并安装到本地 Maven 仓库
-
进入公共模块的根目录:
cd common-core
-
执行 Maven 安装:
mvn clean install
成功后,
common-core
的 JAR 包会被安装到本地 Maven 仓库(~/.m2/repository/com/yourcompany/common-core/1.0.0/
)。
(3)在其他模块中引入该依赖
在需要引用 common-core
的模块(如 service-a
)的 pom.xml
中添加:
<dependencies>
<dependency>
<groupId>com.yourcompany</groupId>
<artifactId>common-core</artifactId>
<version>1.0.0</version> <!-- 版本必须与 common-core 的 pom.xml 一致 -->
</dependency>
</dependencies>
步骤7:配置.gitignore文件
.gitignore文件内部用来规定哪些文件不会被提交到git仓库。
.gitignore
文件用于指定应被 Git 忽略的文件或目录,其语法规则如下:
1.空行:被忽略,可用于分隔不同的规则块。
2.注释:以 #
开头的行被视为注释。
# 这是一个注释
3.通配符:
*
(星号):匹配零个或多个任意字符,但不匹配路径分隔符 /
。
*.log # 匹配所有以 .log 结尾的文件
?
(问号):匹配任意单个字符。
config?.yml # 匹配 config1.yml、configA.yml 等
[]
(方括号):匹配方括号内的任意一个字符。
test[12].txt # 匹配 test1.txt 和 test2.txt
**
(双星号):匹配任意层级的目录。
**/logs # 匹配任意位置的 logs 目录
4.目录匹配:
-
以
/
结尾:表示匹配目录。temp/ # 匹配 temp 目录
-
以
/
开头:表示从仓库根目录开始匹配。/build # 仅匹配仓库根目录下的 build 文件或目录
5.取反匹配:以 !
开头的模式表示例外,即不忽略匹配该模式的文件或目录。
*.log
!important.log # 忽略所有 .log 文件,但不忽略 important.log
注意:如果父目录已被忽略,则子文件或目录即使使用取反模式也无法被包含。
6.转义字符:如果文件名中包含特殊字符(如 #
、!
等),可使用反斜杠 \
进行转义。
\#important.log # 匹配文件名为 #important.log 的文件
步骤8:为子模块配置SDK
多模块项目的配置缺失:多模块项目中,子模块的语言级别和 SDK 设置可能不会自动继承父项目配置,因此需要手动确认。
Project SDK:指定了项目使用的 JDK 版本,它提供了 Java 编译器、运行时以及核心库(如 java.lang.String
等基础类)。如果没有指定正确的 SDK,IDE 就无法找到这些核心库,从而导致无法解析符号的错误。
如何在 IntelliJ IDEA 中设置
具体操作如下:
1.配置项目级别的 SDK 和语言级别
- 打开
File > Project Structure > Project
。 - 在
Project SDK
下拉菜单中,选择适合的 JDK 版本。如果列表中没有目标 JDK,可以通过New
按钮添加。 - 在
Project language level
下拉菜单中,选择匹配的 Java 语言级别。
2.配置模块级别的 SDK 和语言级别
- 进入
File > Project Structure > Modules
。 - 选择子模块,在右侧设置
SDK
为项目 SDK。 - 在
Language Level
下拉菜单中,确保选择了与项目兼容的语言级别。
步骤9:提交到Gitee远程仓库
- 本地分支:在你的本地 Git 仓库中创建和管理的分支。每个本地分支有独立的开发历史和变更记录。
- 远程分支:指的是在远程仓库(如 GitHub、Gitee 等)中的分支。远程分支通常与团队其他成员共享,用于协作开发。
- 推送(Push):将本地分支的更新推送到远程分支,使团队成员看到你的改动。
- 拉取(Pull):将远程分支的更改拉到本地分支,确保自己的代码与团队同步。
在 IntelliJ IDEA 中提交到 Gitee 仓库时,不建议直接使用 Gitee 账户的用户名和密码。Gitee 已弃用简单的账户密码方式,推荐使用 访问令牌(Access Token) 来替代密码进行身份验证。
使用 Gitee 的访问令牌(Access Token)
为什么使用访问令牌而非账户密码?
使用访问令牌比直接使用账户密码更安全,而且 Gitee 也不再允许简单密码的远程认证,因此 访问令牌 是推送和拉取代码的推荐方式。
1. 生成 Gitee 访问令牌
- 登录您的 Gitee 账号。
- 点击右上角头像,选择“设置”。
- 在左侧菜单中,选择“安全设置”。
- 找到“私人令牌”部分,点击“生成新令牌”。
- 为令牌命名,选择所需的权限(如
repo
、user
等),然后点击“生成”。 - 注意:生成的令牌只会显示一次,请妥善保存。
2. 在 IntelliJ IDEA 中配置 Gitee 账户
- 打开 IntelliJ IDEA,点击菜单栏的
File
,选择Settings
(或Preferences
,视操作系统而定)。 - 在设置窗口中,导航到
Version Control
>GitHub
。 - 点击右侧的“+”按钮,选择“Gitee”。
- 在弹出的对话框中,选择“Log In with Token”。
- 将之前生成的访问令牌粘贴到相应的输入框中,点击“Add Account”。
3. 提交代码到 Gitee 仓库
- 在项目中,右键点击需要提交的文件或目录,选择
Git
>Commit
。 - 在提交窗口中,填写提交信息,点击“Commit”。
- 提交后,点击“Push”按钮,将代码推送到远程 Gitee 仓库。
最终项目结构
构建完成后,项目结构如下,每个子模块下都会有一个 target
文件夹,用于存放构建结果:
cangqiong/
├── pom.xml # 父项目 POM 文件,包含依赖管理和模块配置
├── .gitignore # Git 忽略文件
├── .idea/ # IDEA 项目配置
├── module1/
│ ├── src/ # 子模块的源代码目录
│ ├── target/ # 子模块的构建结果目录(由mvn install生成)
│ └── pom.xml # 子模块的 POM 文件,继承父项目
└── module2/
├── src/
├── target/
└── pom.xml
注意
- 每个子模块的
target
文件夹在运行mvn install
或其他构建命令时自动生成,包含.class
文件、测试报告、打包的.jar
文件等。建议在.gitignore
中忽略target
文件夹,避免提交到版本控制系统中。
完整的.gitignore
文件配置如下,其中规定了哪些文件不提交到git仓库。
# IntelliJ IDEA 配置
.idea/
*.iml
# Maven 编译输出目录
**/target/
# 忽略操作系统生成的临时文件
.DS_Store
Thumbs.db