pom.xml详解
一、基本结构
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">
<!-- 以下为各个配置部分 -->
</project>
二、必须元素
2.1、模型版本
xml
<modelVersion>4.0.0</modelVersion>
2.2、项目坐标
xml
<groupId>com.example</groupId> <!-- 组织标识,通常是公司域名的反写 -->
<artifactId>my-project</artifactId> <!-- 项目标识 -->
<version>1.0.0</version> <!-- 版本号 -->
<packaging>jar</packaging> <!-- 打包方式:jar, war, pom 等 -->
三、详细配置
3.1、基本信息
xml
<name>项目名称</name>
<description>项目描述</description>
<url>项目URL</url>
<inceptionYear>2023</inceptionYear>
<!-- 组织信息 -->
<organization>
<name>公司名称</name>
<url>公司网址</url>
</organization>
3.2、依赖管理
xml
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope> <!-- compile, provided, runtime, system, test -->
<optional>true</optional> <!-- 可选依赖 -->
<exclusions> <!-- 排除传递依赖 -->
<exclusion>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
3.3、依赖管理
xml
<dependencyManagement>
<dependencies>
<!-- 定义依赖版本,子模块可以直接使用不用写版本号 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.7.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
3.4、构建配置
xml
<build>
<!-- 最终名称 -->
<finalName>${project.artifactId}-${project.version}</finalName>
<!-- 源代码目录 -->
<sourceDirectory>src/main/java</sourceDirectory>
<testSourceDirectory>src/test/java</testSourceDirectory>
<!-- 资源目录 -->
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering> <!-- 是否替换资源文件中的占位符 -->
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<excludes>
<exclude>**/*.txt</exclude>
</excludes>
</resource>
</resources>
<!-- 插件配置 -->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
<!-- 插件管理 -->
<pluginManagement>
<plugins>
<!-- 统一管理插件版本 -->
</plugins>
</pluginManagement>
</build>
3.5、属性定义
xml
<properties>
<!-- 系统属性 -->
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
<!-- 自定义属性 -->
<spring.version>5.3.0</spring.version>
<junit.version>4.13.2</junit.version>
</properties>
3.6、仓库配置
xml
<repositories>
<repository>
<id>central</id>
<name>Central Repository</name>
<url>https://repo.maven.apache.org/maven2</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<!-- 私服配置 -->
<repository>
<id>nexus</id>
<name>Company Nexus</name>
<url>http://nexus.company.com/repository/maven-public/</url>
</repository>
</repositories>
<pluginRepositories>
<!-- 插件仓库 -->
</pluginRepositories>
3.7、环境信息
xml
<issueManagement>
<system>GitHub</system>
<url>https://github.com/example/issues</url>
</issueManagement>
<ciManagement>
<system>Jenkins</system>
<url>http://jenkins.company.com</url>
</ciManagement>
<scm>
<connection>scm:git:https://github.com/example/project.git</connection>
<developerConnection>scm:git:https://github.com/example/project.git</developerConnection>
<url>https://github.com/example/project</url>
</scm>
3.8、开发者信息
xml
<developers>
<developer>
<id>zhangsan</id>
<name>张三</name>
<email>zhangsan@example.com</email>
<organization>Example Inc.</organization>
<roles>
<role>architect</role>
<role>developer</role>
</roles>
</developer>
</developers>
<contributors>
<!-- 贡献者信息 -->
</contributors>
3.9、许可证
xml
<licenses>
<license>
<name>Apache License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
<distribution>repo</distribution>
</license>
</licenses>
四、多模块配置
4.1、父POM
xml
<!-- 指定打包类型为pom -->
<packaging>pom</packaging>
<!-- 定义子模块 -->
<modules>
<module>module1</module>
<module>module2</module>
<module>module3</module>
</modules>
4.2、子模块POM
xml
<!-- 继承父POM -->
<parent>
<groupId>com.example</groupId>
<artifactId>parent-project</artifactId>
<version>1.0.0</version>
<relativePath>../pom.xml</relativePath> <!-- 父POM相对路径 -->
</parent>
<!-- 子模块自己的坐标 -->
<artifactId>child-module</artifactId>
<!-- groupId和version可继承自父POM -->
五、Profile配置
xml
<profiles>
<profile>
<id>dev</id> <!-- 开发环境 -->
<properties>
<env>development</env>
</properties>
<activation>
<activeByDefault>true</activeByDefault> <!-- 默认激活 -->
</activation>
</profile>
<profile>
<id>test</id> <!-- 测试环境 -->
<properties>
<env>test</env>
</properties>
</profile>
<profile>
<id>prod</id> <!-- 生产环境 -->
<properties>
<env>production</env>
</properties>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>application-prod.properties</include>
</includes>
</resource>
</resources>
</build>
</profile>
</profiles>
六、常用命令与POM的关系
| 命令 | 作用 | 相关POM配置 |
|---|---|---|
mvn compile |
编译 | build/plugins, sourceDirectory |
mvn test |
测试 | dependencies(scope=test), testSourceDirectory |
mvn package |
打包 | packaging, build/finalName |
mvn install |
安装到本地仓库 | groupId/artifactId/version |
mvn deploy |
部署到远程仓库 | distributionManagement |
mvn clean |
清理 | build/outputDirectory |
mvn site |
生成站点文档 | reporting |
七、最佳实践
1. 统一版本管理
xml
<!-- 在父POM中统一定义版本 -->
<properties>
<spring.version>5.3.0</spring.version>
</properties>
<!-- 子模块引用 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
2. 使用dependencyManagement管理依赖版本
3. 合理使用scope
- compile:默认范围,所有阶段都有效
- provided:编译和测试有效,运行时由容器提供
- runtime:运行时和测试有效
- test:仅测试有效
- system:系统依赖,需指定systemPath
4. 资源过滤
xml
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
5. 环境隔离:使用Profile管理不同环境配置
8、常用变量
${project.groupId}项目groupId${project.artifactId}项目artifactId${project.version}项目版本${project.basedir}项目根目录${project.build.sourceDirectory}源码目录${project.build.outputDirectory}编译输出目录${project.build.testSourceDirectory}测试源码目录${project.build.testOutputDirectory}测试输出目录${maven.build.timestamp}构建时间戳