开发基础知识 - Maven
Background
Maven介绍
Maven 是一个项目管理和构建工具,主要用于 Java 项目。
Why we need maven
- 我们写 Java 项目时经常需要用到第三方库,比如数据库驱动、日志工具等等,每个库有版本,可能还需要这些库的库。如果我们自己去找 JAR 文件、下载、放入项目、管理版本,很容易出错。
- 把一个项目从代码变成可以运行的程序,中间有很多步骤:编译、打包、运行测试、生成文档、部署等。每个步骤手动操作非常烦人而且容易出错。
使用Maven后,只需要在 pom.xml 文件中写明需要的库,Maven 会自动从中央仓库下载正确的版本,并配置好路径。
Maven的组成
- pom.xml
pom文件是项目的配置文件。pom文件包含以下信息:
- 项目的基本信息(名字、版本)
- 项目需要哪些依赖(比如 Spring、MySQL 驱动)
- 项目如何构建(比如插件、打包方式)
- 项目是否有子模块(如果是父模块)
<project xmlns="[http://maven.apache.org/POM/4.0.0](http://maven.apache.org/POM/4.0.0)"
xmlns:xsi="[http://www.w3.org/2001/XMLSchema-instance](http://www.w3.org/2001/XMLSchema-instance)"
xsi:schemaLocation="[http://maven.apache.org/POM/4.0.0](http://maven.apache.org/POM/4.0.0)
[https://maven.apache.org/xsd/maven-4.0.0.xsd](https://maven.apache.org/xsd/maven-4.0.0.xsd)">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId> <artifactId>demo-project</artifactId> <version>1.0.0</version> <packaging>jar</packaging>
<name>Demo Maven Project</name>
<description>A simple Maven project example</description>
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.17.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope> </dependency>
</dependencies>
</project>
以下三个标识定义一个资源
- groupId:谁开发的项目(通常是组织/公司/包名)
- artifactId:项目的名字(模块名)
- version:版本号
- 本地仓库
Maven 会把下载的依赖包保存在你电脑上的一个位置(通常在~/.m2/repository里),下次用同样的依赖就不需要重新下载。 - 中央仓库
如果本地没有你需要的库,Maven 会自动从网上的中央仓库去下载。 - 私有仓库
私有仓库用于公司内部不希望公开的jar包,只需要在本地的~/.m2/settings.xml配置好私有仓库的访问,就可以使用。 - 生命周期和插件
Maven定义了统一的构建流程,并且用命令自动化执行:
- mvn clean:删除上一次构建的结果(.class和.jar文件),保证干净的开始
- mvn compile:编译
src/main/java源代码到/target目录下。但它不会打包成 jar,会生成 .class文件。 - mvn test:编译并运行单元测试
- mvn package:编译、测试并打包项目,生成
.jar文件,默认打包的不是 fat jar。 - mvn install:打包后安装到本地仓库(
~/.m2/repository/),供其他项目使用
How maven works
你声明一个依赖后,Maven 会自动下载它所依赖的所有库(传递依赖),一直递归下去,直到依赖链的最底层,全自动完成。
Maven模块管理
实际中,我们通常有很多服务(模块),文件结构:
my-mall/
├── pom.xml <-- 父模块
├── common-utils/ <-- 子模块
│ └── pom.xml
├── user-service/ <-- 子模块
│ └── pom.xml
└── order-service/ <-- 子模块
└── pom.xml
父模块 pom.xml
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>my-mall</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging> <modules>
<module>common-utils</module>
<module>user-service</module>
<module>order-service</module>
</modules>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.27</version>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
</plugins>
</build>
</project>
子模块 pom.xml
<project xmlns="[http://maven.apache.org/POM/4.0.0](http://maven.apache.org/POM/4.0.0)"
xmlns:xsi="[http://www.w3.org/2001/XMLSchema-instance](http://www.w3.org/2001/XMLSchema-instance)"
xsi:schemaLocation="[http://maven.apache.org/POM/4.0.0](http://maven.apache.org/POM/4.0.0)
[http://maven.apache.org/xsd/maven-4.0.0.xsd](http://maven.apache.org/xsd/maven-4.0.0.xsd)">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.example</groupId>
<artifactId>my-mall</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>common-utils</artifactId>
<packaging>jar</packaging> <name>Common Utils Module</name>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
</dependencies>
</project>
- dependencies
使用<dependency>声明一个依赖后,Maven就会自动下载这个依赖包并把它放到classpath中。 - dependencyManagement
在大型项目中,多个模块可能使用同一个库(如 Spring Boot),如果每个模块都自己写依赖版本,可能会产生冲突。dependencyManagement是Maven用来统一定义依赖版本的一个区域,子模块继承后,只写 groupId 和 artifactId 即可。 - modules
在一个父项目中,<modules>标签用来列出所有子模块名称。 - profiles
profiles是Maven的一种机制,用来根据不同的环境或目标,启用不同的配置。
<profiles>
<profile>
<id>dev</id>
<properties>
<jdbc.url>jdbc:mysql://localhost:3306/dev_db</jdbc.url>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<jdbc.url>jdbc:mysql://prod-db:3306/prod_db</jdbc.url>
</properties>
</profile>
</profiles>以上例子在不同环境切换不同的数据库。运行时启用某个profile: mvn clean package -Pprod。
- build
<build>是Maven项目中用来控制如何生成.jar包的区域.
<build>
<finalName>my-awesome-app</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>开发基础知识 - Maven
http://example.com/2025/07/01/SWE_basis/Tools/maven/