1. POM是什么?
POM(Project Object Model)是Maven项目的核心配置文件,采用XML格式。它不仅仅是构建配置文件的集合,更是项目的"身份证明"和"构建蓝图"。一个完整的POM文件定义了项目的所有元信息、依赖关系、构建过程和环境配置。
2. POM文件结构详解
2.1 基础结构
每个pom.xml都必须包含的基本元素:
<?xml version="1.0" encoding="UTF-8"?>
<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>
<!-- GAV坐标 - 项目的唯一标识 -->
<groupId>com.company.project</groupId>
<artifactId>my-application</artifactId>
<version>1.0.0-SNAPSHOT</version>
<!-- 打包类型 -->
<packaging>jar</packaging>
<!-- 更多配置... -->
</project>
2.2 Maven世界的身份证: GAV坐标
groupId:组织或公司标识,通常使用反向域名规则
- 示例:
com.apache.maven
,org.springframework.boot
artifactId:项目名称,在组织内唯一
- 示例:
spring-core
,maven-compiler-plugin
version:项目版本,遵循语义化版本规范
- 示例:
1.0.0
,2.5.4-RELEASE
,3.0.0-SNAPSHOT
packaging:打包方式,决定构建生命周期和产出物
jar
:Java库(默认)war
:Web应用程序pom
:父项目或聚合项目ear
:企业级应用程序
3. 依赖管理:dependencies
3.1 基本依赖配置
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.8</version>
<scope>compile</scope>
<optional>false</optional>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
3.2 依赖范围(scope)
- compile:默认范围,参与编译、测试、运行
- provided:编译和测试需要,但运行时由容器提供
- runtime:运行和测试需要,但编译不需要
- test:仅测试需要
- system:系统依赖,需要显式指定路径
- import:仅用于dependencyManagement中
4. 构建配置:build
4.1 基本构建配置
<build>
<!-- 最终构建产物的名称 -->
<finalName>${project.artifactId}-${project.version}</finalName>
<!-- 资源文件处理 -->
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
<!-- 插件配置 -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>17</source>
<target>17</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
5. 属性管理:properties
5.1 统一定义和管理属性
<properties>
<!-- 项目相关 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!-- 依赖版本 -->
<spring.version>5.3.8</spring.version>
<junit.version>5.7.2</junit.version>
<log4j.version>2.14.1</log4j.version>
<!-- 构建相关 -->
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<!-- 自定义属性 -->
<deploy.path>/opt/applications</deploy.path>
</properties>
<!-- 在依赖中使用属性 -->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
6. 多模块项目:modules
6.1 项目聚合(Aggregation)
<!-- 父pom.xml -->
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.company</groupId>
<artifactId>parent-project</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging> <!-- 必须是pom -->
<modules>
<module>core-module</module>
<module>web-module</module>
<module>service-module</module>
</modules>
</project>
7. 父POM与继承机制
71. 父POM配置
<!-- parent-pom.xml -->
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.company</groupId>
<artifactId>company-parent</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<properties>
<java.version>17</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!-- 依赖管理(重要!) -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.5.4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 插件管理 -->
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
</plugins>
</pluginManagement>
<!-- 通用依赖 -->
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
7.2 子模块继承
<!-- 子模块pom.xml -->
<project>
<modelVersion>4.0.0</modelVersion>
<!-- 指定父POM -->
<parent>
<groupId>com.company</groupId>
<artifactId>company-parent</artifactId>
<version>1.0.0</version>
<relativePath>../parent/pom.xml</relativePath>
</parent>
<artifactId>my-module</artifactId>
<dependencies>
<!-- 无需指定版本,由dependencyManagement管理 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
8. dependencyManagement vs dependencies
8.1 dependencyManagement
- 作用:声明依赖版本,不实际引入依赖
- 使用场景:在父POM中统一管理版本
- 优点:统一版本控制,避免冲突
8.2 dependencies
- 作用:实际引入依赖
- 使用场景:在需要依赖的模块中声明
- 优点:明确模块的依赖关系
9. 插件配置:plugins
9.1 常用插件配置示例
<build>
<plugins>
<!-- 编译器插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>17</source>
<target>17</target>
<compilerArgs>
<arg>-parameters</arg>
</compilerArgs>
</configuration>
</plugin>
<!-- 打包插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>com.company.MainApp</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</build>
10. 完整POM示例
<?xml version="1.0" encoding="UTF-8"?>
<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>
<!-- 项目坐标 -->
<groupId>com.example.company</groupId>
<artifactId>business-app</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging>
<!-- 项目信息 -->
<name>Business Application</name>
<description>企业级业务应用系统</description>
<url>http://www.example.com</url>
<!-- 属性定义 -->
<properties>
<java.version>17</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.version>5.3.8</spring.version>
<junit.version>5.7.2</junit.version>
</properties>
<!-- 依赖管理 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-framework-bom</artifactId>
<version>${spring.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 实际依赖 -->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<!-- 构建配置 -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
11. 最佳实践
- 统一版本管理:使用properties统一定义版本号
- 合理使用继承:通过父POM管理公共配置
- 明确依赖范围:正确使用scope避免依赖污染
- 插件版本固定:明确指定插件版本保证构建稳定性
- 模块化设计:大型项目使用多模块结构
通过深入理解POM的各个组成部分,你可以更好地组织和管理Maven项目,提高开发效率和项目质量。