Maven——pom.xml详解

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}构建时间戳
相关推荐
rannn_1111 小时前
【Javaweb学习|Day6】日志技术、多表查询、分页查询及优化(动态SQL)
java·后端·javaweb
七夜zippoe2 小时前
Elasticsearch核心概念与Java客户端实战 构建高性能搜索服务
java·大数据·elasticsearch·集群·索引·分片
深念Y2 小时前
easylive仿B站项目 后端 单体版 项目构建
java·开发语言
阿杰 AJie2 小时前
Java Stream API详细用法
java·windows·python
蒜香拿铁2 小时前
【第五章】python判断语句if
java·服务器·python
毕设源码-朱学姐2 小时前
【开题答辩全过程】以 公寓楼设备报修管理系统为例,包含答辩的问题和答案
java·eclipse
qq_12498707532 小时前
基于微信小程序的宠物寄领养系统(源码+论文+部署+安装)
java·spring boot·后端·微信小程序·小程序·宠物·计算机毕业设计
独自破碎E2 小时前
说说Java中的JIT
java·开发语言
齐鲁大虾2 小时前
如何通过Java调取打印机打印图片和文本
java·开发语言·python