写点什么

高效开发 Maven 架构设计图解 / 掌握项目工程自动化技巧 (精通篇二)

作者:肖哥弹架构
  • 2024-10-07
    河北
  • 本文字数:12636 字

    阅读完需:约 41 分钟

高效开发Maven架构设计图解/掌握项目工程自动化技巧(精通篇二)


Maven 是一个项目管理和构建自动化工具,主要服务于基于 Java 的项目。它使用一个名为 POM(Project Object Model)的 XML 文件来描述项目的构建过程、依赖、插件等信息。


肖哥弹架构 跟大家“弹弹” 高并发锁, 关注公号回复 'mvcc' 获得手写数据库事务代码

欢迎 点赞,关注,评论。

关注公号 Solomon 肖哥弹架构获取更多精彩内容

历史热点文章

0、本节范围

1、maven POM 结构设计

POM 结构说明

  • 项目对象模型 (POM) : Maven 项目的核心配置文件。

  • 模型基础信息 : 包含模型版本、组 ID、构件 ID、版本和打包方式。

  • 模型版本: POM 模型的版本。

  • 组 ID: 项目组的唯一标识符。

  • 构件 ID: 项目的唯一基础名称。

  • 版本: 项目的当前版本。

  • 打包方式: 项目的打包方式,如 jar、war、pom 等。

  • 父项目 : 定义项目的父项目信息,包括父组 ID、父构件 ID、父版本和父相对路径。

  • 资源(jar/project)依赖 : 项目依赖的列表,包括 jar 和 project 依赖。

  • 构建配置 : 定义项目的构建过程,包括插件配置。

  • 插件 : 构建过程中使用的插件列表。

  • 配置文件 : 定义项目的不同环境配置文件。

  • 配置文件项 : 单个配置文件项。

  • 配置文件 ID: 配置文件的唯一标识。

  • 激活条件: 定义配置文件的激活条件。

  • 仓库 : 配置文件特有的仓库列表。

  • 插件仓库 : 配置文件特有的插件仓库列表。

2、maven POM 案例说明

以下是一个包含详细注释的 Maven pom.xml 案例,这个 pom.xml 文件定义了一个 Maven 项目的完整结构,包括模型版本、项目坐标、依赖管理、构建配置、插件和配置文件等。


<?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">    <!-- 定义 POM 的模型版本 -->    <modelVersion>4.0.0</modelVersion>        <!-- 定义项目组ID,通常是一个反向域名 -->    <groupId>com.example</groupId>    <!-- 定义项目ID,是项目的唯一基础名称 -->    <artifactId>demo-project</artifactId>    <!-- 定义当前版本 -->    <version>1.0-SNAPSHOT</version>    <!-- 定义打包方式,如 jar、war、pom 等 -->    <packaging>jar</packaging>        <!-- 父项目信息,如果该项目有父项目的话 -->    <parent>        <!-- 父项目的组 ID -->        <groupId>com.example.parent</groupId>        <!-- 父项目的构件 ID -->        <artifactId>parent-project</artifactId>        <!-- 父项目的版本 -->        <version>1.0.0</version>        <!-- 父项目相对路径 -->        <relativePath>../parent-project/pom.xml</relativePath>    </parent>        <!-- 项目依赖列表 -->    <dependencies>        <!-- 单个依赖项 -->        <dependency>            <!-- 依赖的组 ID -->            <groupId>junit</groupId>            <!-- 依赖的构件 ID -->            <artifactId>junit</artifactId>            <!-- 依赖的版本 -->            <version>4.12</version>            <!-- 依赖的范围,如 compile, test, provided 等 -->            <scope>test</scope>        </dependency>    </dependencies>        <!-- 构建配置 -->    <build>        <!-- 构建过程中使用的插件列表 -->        <plugins>            <!-- 单个插件 -->            <plugin>                <!-- 插件的组 ID -->                <groupId>org.apache.maven.plugins</groupId>                <!-- 插件的构件 ID -->                <artifactId>maven-compiler-plugin</artifactId>                <!-- 插件的版本 -->                <version>3.8.1</version>                <!-- 插件的配置 -->                <configuration>                    <!-- 编译器的 Java 版本 -->                    <source>1.8</source>                    <target>1.8</target>                </configuration>            </plugin>        </plugins>    </build>        <!-- 配置文件 -->    <profiles>        <!-- 单个配置文件 -->        <profile>            <!-- 配置文件的唯一标识 -->            <id>dev</id>            <!-- 配置文件的激活条件 -->            <activation>                <!-- 是否默认激活 -->                <activeByDefault>true</activeByDefault>                <!-- JDK 版本限制 -->                <jdk>1.8</jdk>                <!-- 操作系统限制 -->                <os>                    <name>Windows</name>                    <family>Windows</family>                    <arch>x86_64</arch>                    <version>10.0</version>                </os>            </activation>            <!-- 配置文件特有的仓库列表 -->            <repositories>                <!-- 仓库配置 -->                <repository>                    <!-- 仓库的唯一标识 -->                    <id>central</id>                    <!-- 仓库的名称 -->                    <name>Central Repository</name>                    <!-- 仓库的 URL -->                    <url>https://repo.maven.apache.org/maven2</url>                    <!-- 仓库的布局 -->                    <layout>default</layout>                    <!-- 快照版本设置 -->                    <snapshots>                        <!-- 是否启用快照版本 -->                        <enabled>true</enabled>                    </snapshots>                    <!-- 正式发布版本设置 -->                    <releases>                        <!-- 是否启用正式发布版本 -->                        <enabled>true</enabled>                    </releases>                </repository>            </repositories>            <!-- 配置文件特有的插件仓库列表 -->            <pluginRepositories>                <!-- 插件仓库配置 -->                <pluginRepository>                    <!-- 插件仓库的唯一标识 -->                    <id>central</id>                    <!-- 插件仓库的名称 -->                    <name>Central Repository</name>                    <!-- 插件仓库的 URL -->                    <url>https://repo.maven.apache.org/maven2</url>                    <!-- 插件仓库的布局 -->                    <layout>default</layout>                    <!-- 插件快照版本设置 -->                    <snapshots>                        <!-- 是否启用插件快照版本 -->                        <enabled>true</enabled>                    </snapshots>                    <!-- 插件正式发布版本设置 -->                    <releases>                        <!-- 是否启用插件正式发布版本 -->                        <enabled>true</enabled>                    </releases>                </pluginRepository>            </pluginRepositories>        </profile>    </profiles></project>
复制代码

3、maven 配置文件激活策略

在 Maven 的 pom.xml 文件中定义了 <profile> 后,你可以通过多种方式激活该配置文件(profile)。配置文件 dev 的激活可以通过以下方式进行:


3.1. 命令行激活

在执行 Maven 命令时,可以通过 -P 参数指定要激活的配置文件的 ID。例如,要激活 ID 为 dev 的配置文件,可以使用:


mvn clean install -Pdev
复制代码


这告诉 Maven 在构建时使用 dev 配置文件中定义的设置。

3.2. 在 settings.xml 中激活

在用户或全局的 settings.xml 文件中,可以使用 <activeProfiles> 标签激活配置文件。这通常位于 ~/.m2/settings.xml(用户设置)或 /etc/maven/settings.xml(全局设置)。


<!-- Maven 的 settings.xml 文件,用于配置 Maven 的全局设置 --><settings>  <!-- 其他配置元素可以放在这里 -->  ...  <!-- 定义一组活动配置文件 -->  <activeProfiles>    <!-- 定义一个活动配置文件 -->    <activeProfile>dev</activeProfile>  </activeProfiles>  ...</settings>
复制代码


在这个例子中,每次 Maven 运行时都会自动激活 dev 配置文件。

3.3. 自动激活

pom.xml 中定义的配置文件可以包含激活条件,如果这些条件满足,配置文件将自动激活。例如:


<!-- 定义一个配置文件,id 为 dev --><profile>  <!-- 配置文件的唯一标识符 -->  <id>dev</id>  <!-- 激活条件 -->  <activation>    <!-- 如果希望这个配置文件默认激活,设置 activeByDefault 为 true -->    <activeByDefault>true</activeByDefault>    <!-- 激活条件:指定 JDK 版本 -->    <jdk>1.8</jdk>    <!-- 激活条件:操作系统 -->    <os>      <!-- 操作系统的名称 -->      <name>Windows</name>      <!-- 操作系统的家族 -->      <family>Windows</family>      <!-- 操作系统的架构 -->      <arch>x86_64</arch>      <!-- 操作系统的版本 -->      <version>10.0</version>    </os>  </activation></profile>
复制代码


在这个例子中,如果运行 Maven 的环境符合指定的 JDK 版本和操作系统条件,dev 配置文件将自动激活。

3.4. 通过环境变量激活

可以在 activation 标签内使用环境变量来控制配置文件的激活:


<!-- 在 Maven 的 pom.xml 文件中定义一个名为 dev 的配置文件 --><profile>  <!-- 配置文件的唯一标识符 -->  <id>dev</id>  <!-- 定义此配置文件的激活条件 -->  <activation>    <!-- 通过属性来激活配置文件 -->    <property>      <!-- 指定属性的名称 -->      <name>env</name>      <!-- 指定属性的值,当命令行或环境变量中该属性被设置为 dev 时,此配置文件将被激活 -->      <value>dev</value>    </property>  </activation>  <!-- 配置文件内的其他配置,如构建配置、依赖等,可以放在这里 -->  ...</profile>
复制代码


然后,可以在命令行中设置环境变量来激活配置文件:


export env=devmvn clean install
复制代码


或者在 Windows 命令行中:


set env=devmvn clean install
复制代码


或者 通过 Maven 命令行参数激活,在 Maven 命令中直接设置属性 env


mvn clean install -Denv=dev
复制代码


这些方法提供了灵活的配置文件激活方式,可以根据不同的构建环境和需求进行选择。

4、maven 依赖管理

Maven 使用一个中央仓库来管理项目的依赖。每个依赖都由一组坐标定义,Maven 可以根据这些坐标自动下载和安装依赖。


4.1 依赖坐标

每个依赖都由一组坐标定义,这些坐标是:


  • GroupId: 项目组的唯一标识符,通常是一个反向域名。

  • ArtifactId: 项目的唯一基础名称。

  • Version: 项目当前的版本。这些坐标一起构成了 Maven 依赖的全局唯一标识符。

4.2 依赖范围

依赖范围定义了依赖在哪些构建阶段被包含,常见的依赖范围有:


  • compile: 编译范围,这是默认值。依赖在编译、测试、运行时都可用。

  • test: 测试范围,依赖仅在测试编译和执行阶段可用。

  • provided: 提供范围,依赖在编译和测试时可用,但在运行时需要由运行环境提供。

  • runtime: 运行时范围,依赖在测试和运行时可用,但不在编译时。

  • system: 系统范围,与 provided 类似,但不推荐使用,因为它要求开发者在本地机器上手动安装指定的依赖。


依赖范围定义了依赖在哪些构建阶段被包含:


<dependencies>    <!-- compile 范围,依赖在编译、测试、运行时都可用 -->    <dependency>        <groupId>org.springframework</groupId>        <artifactId>spring-core</artifactId>        <version>5.3.10</version>        <scope>compile</scope>    </dependency>        <!-- test 范围,依赖仅在测试编译和执行阶段可用 -->    <dependency>        <groupId>junit</groupId>        <artifactId>junit</artifactId>        <version>4.13.2</version>        <scope>test</scope>    </dependency>        <!-- provided 范围,依赖在编译和测试时可用,运行时需要由服务器提供 -->    <dependency>        <groupId>javax.servlet</groupId>        <artifactId>javax.servlet-api</artifactId>        <version>4.0.1</version>        <scope>provided</scope>    </dependency>        <!-- runtime 范围,依赖在测试和运行时可用,但不在编译时 -->    <dependency>        <groupId>mysql</groupId>        <artifactId>mysql-connector-java</artifactId>        <version>8.0.23</version>        <scope>runtime</scope>    </dependency>        <!-- system 范围,与 provided 类似,但不推荐使用 -->    <dependency>        <groupId>com.example</groupId>        <artifactId>system-dependency</artifactId>        <version>1.0.0</version>        <scope>system</scope>        <systemPath>/path/to/system/library</systemPath>    </dependency></dependencies>
复制代码

4.3 依赖调解

依赖调解(Dependency Mediation)是 Maven 解决依赖冲突的过程。当项目中引入的多个依赖指定了同一个依赖的不同版本时,Maven 会根据版本号选择一个版本:


  • Maven 会遵循“最近版本”原则,选择最新的版本作为最终版本。

  • 如果依赖有明确的版本号,Maven 会使用指定的版本。

  • 如果依赖使用了动态版本号(如 ${property.name}),Maven 会使用 POM 中定义的属性值。


依赖调解是 Maven 解决依赖冲突的过程:


<dependencies>    <!-- 假设项目 A 和 B 都依赖 C,但版本不同,Maven 会选择最高版本 -->    <dependency>        <groupId>com.example</groupId>        <artifactId>A</artifactId>        <version>1.0.0</version>    </dependency>    <dependency>        <groupId>com.example</groupId>        <artifactId>B</artifactId>        <version>2.0.0</version>    </dependency>    <!-- C 的两个版本,Maven 会选择 2.0.0 版本 -->    <dependency>        <groupId>com.example</groupId>        <artifactId>C</artifactId>        <version>1.0.0</version>    </dependency>    <dependency>        <groupId>com.example</groupId>        <artifactId>C</artifactId>        <version>2.0.0</version>    </dependency></dependencies>
复制代码

5.4 传递性依赖

传递性依赖是指一个依赖除了它自己还包含了其他依赖。Maven 会解析所有传递性依赖,并尝试确保依赖树的一致性和最小化:


  • Maven 会构建项目的依赖树,展示每个依赖的来源。

  • Maven 会尝试解决任何版本冲突,选择一个合适的版本。

  • Maven 提供了依赖排除功能,允许用户从依赖中排除特定的传递性依赖。


传递性依赖是指一个依赖除了它自己还包含了其他依赖:


<dependencies>    <!-- 直接依赖 A -->    <dependency>        <groupId>com.example</groupId>        <artifactId>A</artifactId>        <version>1.0.0</version>    </dependency>    <!-- 传递性依赖 B,A 依赖 B -->    <dependency>        <groupId>com.example</groupId>        <artifactId>B</artifactId>        <version>2.0.0</version>        <exclusions>            <exclusion>                <groupId>com.example</groupId>                <artifactId>C</artifactId>            </exclusion>        </exclusions>    </dependency>    <!-- 传递性依赖 C,B 依赖 C,但已排除 --></dependencies>
复制代码


在这个例子中,A 依赖 BB 又依赖 C,但 CB 依赖项中的 <exclusions> 标签排除了

5. 构建生命周期

Maven 的构建生命周期是一系列阶段,每个阶段执行一组特定的任务。主要的生命周期包括:


  • clean: 清理项目。

  • default (编译、测试、打包、部署等): 包括 compile、test、package、install、deploy。

  • site: 生成项目报告文档。


每个生命周期阶段都可以由一系列插件来实现,这些插件定义了该阶段的具体行为。

Maven 生命周期图说明

  • Clean 生命周期: 负责清理项目,例如删除生成的文件。

  • pre-clean: 清理前的操作。

  • clean: 执行清理操作。

  • post-clean: 清理后的操作。

  • Default 生命周期: 构建项目的主要生命周期。

  • validate: 验证项目信息。

  • compile: 编译源代码。

  • test: 运行测试。

  • package: 将代码打包。

  • integration-test: 集成测试。

  • verify: 验证构建。

  • install: 安装到本地仓库。

  • deploy: 部署到远程仓库。

  • Site 生命周期: 生成项目报告文档。

  • pre-site: 准备生成项目文档。

  • site: 生成项目文档。

  • post-site: 生成项目文档后的操作。

  • site-deploy: 部署项目文档。

插件

  • JGit: Maven 使用 JGit 插件处理 Git 相关任务。

  • maven-compiler-plugin: Maven 使用编译插件编译 Java 代码。

  • maven-surefire-plugin: Maven 使用 Surefire 插件运行单元测试。

  • maven-jar-plugin: Maven 使用 JAR 插件打包应用为 JAR 文件。

  • maven-war-plugin: Maven 使用 WAR 插件打包应用为 WAR 文件。

  • maven-deploy-plugin: Maven 使用部署插件部署项目。

  • maven-site-plugin: Maven 使用 Site 插件生成项目报告文档。

5.1 默认构建生命周期时序图

Maven 默认构建生命周期时序图说明
  • Maven: 表示 Maven 构建工具本身,负责驱动整个构建过程。

  • Plugins: 表示 Maven 插件,它们实现了各个构建阶段的具体任务。


各个阶段说明:


  1. validate: 验证项目可以被构建。

  2. initialize: 初始化构建。

  3. generate-sources: 生成源代码。

  4. process-sources: 处理源代码。

  5. generate-resources: 生成资源文件。

  6. process-resources: 复制并处理资源文件到目标目录。

  7. compile: 编译项目的源代码。

  8. process-classes: 处理编译生成的类文件。

  9. generate-test-sources: 生成测试源代码。

  10. process-test-sources: 处理测试源代码。

  11. generate-test-resources: 生成测试资源。

  12. process-test-resources: 复制并处理测试资源文件到目标目录。

  13. test-compile: 编译测试源代码。

  14. process-test-classes: 处理测试编译生成的类文件。

  15. test: 运行测试。

  16. prepare-package: 准备打包。

  17. package: 将编译的代码打包成 JAR、WAR 或其他格式。

  18. pre-integration-test: 在集成测试执行之前准备。

  19. integration-test: 执行集成测试。

  20. post-integration-test: 集成测试执行之后的工作。

  21. verify: 验证包是否符合质量标准。

  22. install: 将包安装到本地仓库,供其他项目使用。

  23. deploy: 将最终的包部署到远程仓库。

5.2 构建生命周操作命令

5.2.1 执行整个生命周期

执行以下命令将处理整个构建生命周期,默认从 validate 阶段开始直到 install 阶段:


mvn clean install
复制代码


如果你想跳过测试,可以使用 -DskipTests 参数:


mvn clean install -DskipTests
复制代码
5.2.2 执行特定阶段

你可以通过在命令中指定阶段来执行特定阶段或一系列阶段。例如:


  • 编译源代码:


mvn compile
复制代码


或者使用 package 阶段作为开始点:


mvn package
复制代码


  • 运行测试:


mvn test
复制代码


如果你想要运行特定的测试,可以使用 it.test 参数:


mvn test -Dit.test=SomeTest
复制代码


  • 打包项目:


mvn package
复制代码


  • 安装项目到本地仓库:


mvn install
复制代码


  • 部署项目到远程仓库:


mvn deploy
复制代码


在执行部署之前,你可能需要配置 pom.xml 中的部署信息和服务器信息。

5.2.3 使用生命周期辅助命令

Maven 也提供了一些辅助命令来帮助你执行常见的任务:


  • 清理项目 (Clean Lifecycle):


mvn clean
复制代码


这将执行 clean 阶段,通常删除 target 目录中的所有生成物。


  • 更新项目依赖 (Default Lifecycle):


mvn update
复制代码


这将更新项目的依赖,但不构建项目。


  • 生成项目报告 (Site Lifecycle):


mvn site
复制代码


这将生成项目报告,包括 JavaDoc、测试结果等。

5.2.4 执行特定插件的特定目标

你还可以执行特定插件的特定目标(goal)。例如,使用 Javadoc 插件生成 JavaDoc:


mvn javadoc:javadoc
复制代码


请注意,javadoc:javadocmaven-javadoc-pluginjavadoc 目标。

5.2.5 组合命令

你可以组合 Maven 命令来执行多个阶段或任务。例如,要清理项目并安装:


mvn clean install
复制代码


这将执行从 clean 阶段到 install 阶段的所有任务。

6. 插件和目标

Maven 插件是实现 Maven 生命周期阶段的代码。插件可以被绑定到生命周期的特定阶段,或者直接由用户在命令行中调用。


  • 插件: 一个 Maven 插件可以包含多个目标(goals),每个目标执行一个特定的任务。

  • 目标: 插件中的一个可执行单元,例如 maven-compiler-plugin 有一个 compile 目标,用于编译源代码。

6.1 插件与目标关系图

Maven 插件与目标图说明
  • 插件 (Plugin) : Maven 插件是 Maven 构建过程中的一个扩展点,可以执行多种任务。

  • 目标 1, 2, 3 (Goal) : 表示插件中定义的不同的可执行目标。


插件实例:maven-compiler-plugin


  • maven-compiler-plugin:

  • compile: 编译项目的主源代码。

  • testCompile: 编译测试源代码。


执行插件目标


你可以通过命令行执行特定的 Maven 目标:


mvn <groupId>:<artifactId>:<goalName>
复制代码


例如,要执行 maven-compiler-plugin 的 compile 目标:


mvn compiler:compile  或mvn org.apache.maven.plugins:maven-compiler-plugin:compile
复制代码


这将编译项目的源代码。

6.2 插件与目标类设计图

Maven 类图说明
  • Goal (目标) :

  • goalName: 目标的名称。

  • description: 目标的描述。

  • configurations: 目标的配置参数。

  • phase: 目标绑定的构建生命周期阶段。

  • Plugin (插件) :

  • groupId: 插件的组唯一标识符。

  • artifactId: 插件的唯一基础名称。

  • version: 插件的版本。

  • goals: 插件包含的目标列表。

  • Execution (执行) :

  • id: 执行的唯一标识符。

  • phase: 执行的构建生命周期阶段。

  • goals: 执行指定的目标列表。

  • Project (项目) :

  • groupId: 项目的组唯一标识符。

  • artifactId: 项目的唯一基础名称。

  • version: 项目当前版本。

  • plugins: 项目使用的插件列表。

  • executions: 项目配置的执行列表。

6.3 插件与目标执行流程图

Maven 插件工作流程说明
  1. 开始: 构建过程启动。

  2. 项目构建触发: Maven 根据命令行输入或 IDE 触发构建。

  3. 插件是否被调用: 检查当前构建阶段是否需要执行插件。

  4. 插件初始化: 插件载入并初始化。

  5. 目标列表载入: 插件中定义的所有目标被载入。

  6. 配置参数处理: 处理插件的配置参数。

  7. 执行具体目标: 执行具体的构建任务。

  8. 所有目标是否完成: 检查插件中的所有目标是否执行完成。

  9. 插件后处理: 执行完成后的清理和资源回收。

  10. 构建继续或结束: 根据构建流程,决定是继续执行下一个插件还是结束构建。

6.4 插件定义 XML 案例

6.4.1. maven-compiler-plugin 插件配置示例
<build> <!-- 定义项目的构建细节 -->    <resources> <!-- 定义项目资源的列表 -->        <resource> <!-- 单个资源配置 -->            <directory>src/main/resources</directory> <!-- 指定资源文件所在的目录 -->            <includes> <!-- 定义包含的文件模式 -->                <include>**/*.properties</include> <!-- 包含所有扩展名为 .properties 的文件 -->                <include>**/*.xml</include> <!-- 包含所有扩展名为 .xml 的文件 -->            </includes>            <excludes> <!-- 定义排除的文件模式 -->                <exclude>**/*.dev.*</exclude> <!-- 排除所有扩展名为 .dev 的文件,如 .dev.properties -->            </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> <!-- 指定编译源代码的 Java 版本 -->                <target>1.8</target> <!-- 指定编译生成的目标 JVM 版本 -->            </configuration>        </plugin>    </plugins></build>
复制代码


这个配置指定了用于编译项目的 Maven 编译插件,设定了 Java 源代码和目标编译版本为 1.8。


多目标定义


<build> <!-- 定义项目的构建过程 -->    <plugins> <!-- 构建过程中使用的插件列表 -->        <plugin> <!-- 单个插件的配置 -->            <groupId>org.apache.maven.plugins</groupId> <!-- 插件的组唯一标识符 -->            <artifactId>maven-compiler-plugin</artifactId> <!-- 插件的唯一基础名称 -->            <version>3.8.1</version> <!-- 插件的版本 -->            <configuration> <!-- 插件的详细配置 -->                <source>1.8</source> <!-- 指定编译源代码的 Java 版本 -->                <target>1.8</target> <!-- 指定编译生成的目标 JVM 版本 -->            </configuration>            <executions> <!-- 定义插件的执行实例 -->                <execution> <!-- 单个执行实例的配置 -->                    <id>default-compile</id> <!-- 为这次执行实例定义一个唯一的 ID -->                    <phase>compile</phase> <!-- 指定 Maven 构建生命周期的哪个阶段执行这个目标 -->                    <goals> <!-- 定义要执行的目标 -->                        <goal>compile</goal> <!-- 指定具体要执行的目标 -->                    </goals>                </execution>                <execution> <!-- 另一个执行实例的配置 -->                    <id>default-testCompile</id> <!-- 定义一个唯一的 ID -->                    <phase>test-compile</phase> <!-- 指定 Maven 构建生命周期的测试编译阶段 -->                    <goals> <!-- 定义要执行的目标 -->                        <goal>testCompile</goal> <!-- 指定具体要执行的目标 -->                    </goals>                </execution>            </executions>        </plugin>    </plugins></build>
复制代码


这个配置案例展示了如何在 Maven 项目的 pom.xml 文件中配置 maven-compiler-plugin 插件,并将其绑定到特定的构建阶段和目标。这样,当 Maven 构建到达 compiletest-compile 阶段时,它将分别执行 compiletestCompile 目标。

6.4.2. maven-surefire-plugin 插件配置示例
<build> <!-- 定义项目的构建细节 -->    <plugins> <!-- 构建过程中使用的插件列表 -->        <plugin> <!-- 单个插件的配置 -->            <groupId>org.apache.maven.plugins</groupId> <!-- 插件的组唯一标识符 -->            <artifactId>maven-surefire-plugin</artifactId> <!-- 插件的唯一基础名称 -->            <version>2.22.2</version> <!-- 插件的版本 -->            <configuration> <!-- 插件的详细配置 -->                <skipTests>false</skipTests> <!-- 设置是否跳过测试 -->            </configuration>        </plugin>    </plugins></build>
复制代码


这个配置用于运行单元测试的 Maven Surefire 插件,设置为不跳过测试。

6.4.3. maven-jar-plugin 插件配置示例
<build> <!-- 定义项目的构建细节 -->    <plugins> <!-- 构建过程中使用的插件列表 -->        <plugin> <!-- 单个插件的配置 -->            <groupId>org.apache.maven.plugins</groupId> <!-- 插件的组唯一标识符 -->            <artifactId>maven-jar-plugin</artifactId> <!-- 插件的唯一基础名称 -->            <version>3.2.0</version> <!-- 插件的版本 -->            <configuration> <!-- 插件的详细配置 -->                <archive> <!-- 定义打包的详细配置 -->                    <manifest> <!-- 定义 JAR 的 Manifest 文件 -->                        <addClasspath>true</addClasspath> <!-- 指示 Manifest 文件中应包含 Class-Path 入口 -->                        <mainClass>com.example.MainClass</mainClass> <!-- 指定应用的主类 -->                    </manifest>                </archive>            </configuration>        </plugin>    </plugins></build>
复制代码


这个配置用于创建可执行 JAR 文件的 Maven JAR 插件,指定了程序的主类。

6.4.4. maven-war-plugin 插件配置示例
<build> <!-- 定义项目的构建细节 -->    <plugins> <!-- 构建过程中使用的插件列表 -->        <plugin> <!-- 单个插件的配置 -->            <groupId>org.apache.maven.plugins</groupId> <!-- 插件的组唯一标识符 -->            <artifactId>maven-war-plugin</artifactId> <!-- 插件的唯一基础名称 -->            <version>3.3.1</version> <!-- 插件的版本 -->            <configuration> <!-- 插件的详细配置 -->                <warSourceDirectory>src/main/webapp</warSourceDirectory> <!-- 指定 Web 应用资源的目录 -->            </configuration>        </plugin>    </plugins></build>
复制代码


这个配置用于创建 Web 应用的 WAR 文件的 Maven WAR 插件,指定了 Web 应用资源的目录。

6.4.5. maven-deploy-plugin 插件配置示例
<build> <!-- 定义项目的构建细节 -->    <plugins> <!-- 构建过程中使用的插件列表 -->        <plugin> <!-- 单个插件的配置 -->            <groupId>org.apache.maven.plugins</groupId> <!-- 插件的组唯一标识符 -->            <artifactId>maven-deploy-plugin</artifactId> <!-- 插件的唯一基础名称 -->            <version>2.8.2</version> <!-- 插件的版本 -->        </plugin>    </plugins></build>
复制代码


这个配置用于将项目部署到远程仓库的 Maven Deploy 插件。

6.4.6. maven-site-plugin 插件配置示例
<build> <!-- 定义项目的构建细节 -->    <plugins> <!-- 构建过程中使用的插件列表 -->        <plugin> <!-- 单个插件的配置 -->            <groupId>org.apache.maven.plugins</groupId> <!-- 插件的组唯一标识符 -->            <artifactId>maven-site-plugin</artifactId> <!-- 插件的唯一基础名称 -->            <version>3.9.1</version> <!-- 插件的版本 -->        </plugin>    </plugins></build>
复制代码


这个配置用于生成项目报告的 Maven Site 插件。用户可以通过配置 POM 来自定义插件的行为,或者通过命令行参数来传递参数给插件。


其他内容在第二篇文章《高效开发 Maven 架构设计图解/掌握项目工程自动化技巧(精通篇二)》中。。。

发布于: 刚刚阅读数: 3
用户头像

智慧属心窍之锁 2019-05-27 加入

擅长于通信协议、微服务架构、框架设计、消息队列、服务治理、PAAS、SAAS、ACE\ACP、大模型

评论

发布
暂无评论
高效开发Maven架构设计图解/掌握项目工程自动化技巧(精通篇二)_maven_肖哥弹架构_InfoQ写作社区