Maven是一个基于项目对象模型(POM)的项目管理工具,主要用于:
约定优于配置(Convention Over Configuration)
src/main/java - Java源代码
src/main/resources - 资源文件
src/main/webapp - Web资源
src/test/java - 测试代码
src/test/resources - 测试资源
target - 编译输出
依赖管理
project-root/
├── src/
│ ├── main/
│ │ ├── java/ # Java源代码
│ │ ├── resources/ # 配置文件
│ │ └── webapp/ # Web应用资源
│ └── test/
│ ├── java/ # 测试代码
│ └── resources/ # 测试资源
├── target/ # 编译输出
├── pom.xml # 项目配置文件
└── README.md
<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.0modelVersion>
<groupId>com.examplegroupId>
<artifactId>my-projectartifactId>
<version>1.0.0version>
<packaging>jarpackaging>
<name>My Projectname>
<description>Project descriptiondescription>
<url>http://example.comurl>
<properties>
<java.version>17java.version>
<spring.version>3.2.0spring.version>
<maven.compiler.source>17maven.compiler.source>
<maven.compiler.target>17maven.compiler.target>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
properties>
<dependencies>
dependencies>
<build>
<plugins>
plugins>
build>
<dependencyManagement>
dependencyManagement>
<repositories>
repositories>
<pluginRepositories>
pluginRepositories>
project>
1. Clean生命周期
pre-clean → clean → post-clean
2. Default生命周期
validate → compile → test → package → verify → install → deploy
3. Site生命周期
pre-site → site → post-site → site-deploy
Default生命周期主要阶段:
阶段 | 描述 | 主要任务 |
---|---|---|
validate | 验证 | 验证项目配置是否正确 |
compile | 编译 | 编译源代码 |
test | 测试 | 运行单元测试 |
package | 打包 | 将编译后的代码打包 |
verify | 验证 | 检查包是否有效 |
install | 安装 | 安装到本地仓库 |
deploy | 部署 | 部署到远程仓库 |
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<version>3.11.0version>
<configuration>
<source>17source>
<target>17target>
configuration>
plugin>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-surefire-pluginartifactId>
<version>3.1.2version>
plugin>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-jar-pluginartifactId>
<version>3.3.0version>
plugin>
plugins>
build>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
<version>3.2.0version>
<scope>compilescope>
<optional>falseoptional>
<exclusions>
<exclusion>
<groupId>org.springframeworkgroupId>
<artifactId>spring-coreartifactId>
exclusion>
exclusions>
dependency>
Scope | 编译时 | 测试时 | 运行时 | 说明 |
---|---|---|---|---|
compile | ✓ | ✓ | ✓ | 默认范围,所有阶段都可用 |
provided | ✓ | ✓ | ✗ | 由JDK或容器提供 |
runtime | ✗ | ✓ | ✓ | 运行时需要 |
test | ✗ | ✓ | ✗ | 仅测试时需要 |
system | ✓ | ✓ | ✓ | 系统路径依赖 |
import | - | - | - | 仅用于dependencyManagement |
传递依赖规则:
直接依赖\传递依赖 | compile | provided | runtime | test |
---|---|---|---|---|
compile | compile | - | runtime | - |
provided | provided | provided | provided | - |
runtime | runtime | - | runtime | - |
test | test | - | test | - |
1. 最短路径优先
A → B → C(1.0)
A → D → E → C(2.0)
# 选择C(1.0),路径更短
2. 第一声明优先
A → B → C(1.0)
A → D → C(2.0)
# 选择先声明的版本
3. 排除传递依赖
<dependency>
<groupId>com.examplegroupId>
<artifactId>libraryartifactId>
<version>1.0.0version>
<exclusions>
<exclusion>
<groupId>org.slf4jgroupId>
<artifactId>slf4j-apiartifactId>
exclusion>
exclusions>
dependency>
1. 本地仓库
~/.m2/repository
2. 中央仓库
https://repo1.maven.org/maven2/
3. 远程仓库
<repositories>
<repository>
<id>centralid>
<name>Central Repositoryname>
<url>https://repo1.maven.org/maven2url>
<releases>
<enabled>trueenabled>
releases>
<snapshots>
<enabled>falseenabled>
snapshots>
repository>
<repository>
<id>private-repoid>
<name>Private Repositoryname>
<url>http://nexus.company.com/repository/maven-public/url>
repository>
repositories>
<pluginRepositories>
<pluginRepository>
<id>centralid>
<name>Central Repositoryname>
<url>https://repo1.maven.org/maven2url>
pluginRepository>
pluginRepositories>
<mirrors>
<mirror>
<id>aliyunid>
<name>Aliyun Maven Repositoryname>
<url>https://maven.aliyun.com/repository/publicurl>
<mirrorOf>centralmirrorOf>
mirror>
mirrors>
1. 编译插件
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<version>3.11.0version>
<configuration>
<source>17source>
<target>17target>
<encoding>UTF-8encoding>
<compilerArgs>
<arg>-parametersarg>
compilerArgs>
configuration>
plugin>
2. 资源插件
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-resources-pluginartifactId>
<version>3.3.1version>
<configuration>
<encoding>UTF-8encoding>
<nonFilteredFileExtensions>
<nonFilteredFileExtension>pdfnonFilteredFileExtension>
<nonFilteredFileExtension>swfnonFilteredFileExtension>
nonFilteredFileExtensions>
configuration>
plugin>
3. 打包插件
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-jar-pluginartifactId>
<version>3.3.0version>
<configuration>
<archive>
<manifest>
<mainClass>com.example.MainClassmainClass>
<addClasspath>trueaddClasspath>
manifest>
archive>
configuration>
plugin>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-war-pluginartifactId>
<version>3.4.0version>
<configuration>
<warSourceDirectory>src/main/webappwarSourceDirectory>
<failOnMissingWebXml>falsefailOnMissingWebXml>
configuration>
plugin>
4. Spring Boot插件
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<version>3.2.0version>
<configuration>
<mainClass>com.example.ApplicationmainClass>
<excludes>
<exclude>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
exclude>
excludes>
configuration>
plugin>
@Mojo(name = "hello", defaultPhase = LifecyclePhase.COMPILE)
public class HelloMojo extends AbstractMojo {
@Parameter(property = "hello.greeting", defaultValue = "Hello World!")
private String greeting;
@Parameter(property = "hello.name", defaultValue = "Maven")
private String name;
public void execute() throws MojoExecutionException {
getLog().info(greeting + " " + name + "!");
}
}
parent-project/
├── pom.xml (父POM)
├── common/
│ ├── pom.xml
│ └── src/
├── service/
│ ├── pom.xml
│ └── src/
├── web/
│ ├── pom.xml
│ └── src/
└── api/
├── pom.xml
└── src/
<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.0modelVersion>
<groupId>com.examplegroupId>
<artifactId>parent-projectartifactId>
<version>1.0.0version>
<packaging>pompackaging>
<name>Parent Projectname>
<modules>
<module>commonmodule>
<module>servicemodule>
<module>webmodule>
<module>apimodule>
modules>
<properties>
<java.version>17java.version>
<spring.version>3.2.0spring.version>
<mybatis.version>1.8.0mybatis.version>
properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-coreartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>com.mybatis-flexgroupId>
<artifactId>mybatis-flex-spring-boot-starterartifactId>
<version>${mybatis.version}version>
dependency>
dependencies>
dependencyManagement>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<version>3.11.0version>
<configuration>
<source>${java.version}source>
<target>${java.version}target>
configuration>
plugin>
plugins>
pluginManagement>
build>
project>
<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.0modelVersion>
<parent>
<groupId>com.examplegroupId>
<artifactId>parent-projectartifactId>
<version>1.0.0version>
parent>
<artifactId>commonartifactId>
<packaging>jarpackaging>
<name>Common Modulename>
<dependencies>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-coreartifactId>
dependency>
dependencies>
project>
<profiles>
<profile>
<id>devid>
<activation>
<activeByDefault>trueactiveByDefault>
activation>
<properties>
<spring.profiles.active>devspring.profiles.active>
<db.url>jdbc:mysql://localhost:3306/dev_dbdb.url>
properties>
profile>
<profile>
<id>prodid>
<properties>
<spring.profiles.active>prodspring.profiles.active>
<db.url>jdbc:mysql://prod-server:3306/prod_dbdb.url>
properties>
profile>
profiles>
<build>
<resources>
<resource>
<directory>src/main/resourcesdirectory>
<filtering>truefiltering>
<includes>
<include>**/*.propertiesinclude>
<include>**/*.xmlinclude>
includes>
resource>
resources>
build>
# application.properties
db.url=${db.url}
spring.profiles.active=${spring.profiles.active}
# 生成Maven Wrapper
mvn wrapper:wrapper
# 使用Wrapper
./mvnw clean install
./mvnw spring-boot:run
# 查看依赖树
mvn dependency:tree
# 分析依赖冲突
mvn dependency:analyze
# 排除冲突依赖
mvn dependency:resolve
# 清理项目
mvn clean
# 跳过测试
mvn install -DskipTests
# 强制更新依赖
mvn clean install -U
# 增加Maven内存
export MAVEN_OPTS="-Xmx2048m -XX:MaxPermSize=512m"
# 使用并行构建
mvn clean install -T 4
Maven是一个功能强大的项目管理工具,掌握其核心概念和高级特性对于Java开发至关重要。通过合理配置和使用Maven,可以大大提高项目开发效率和质量。