likes
comments
collection
share

maven打包全流程原理

作者站长头像
站长
· 阅读数 21

原文合集地址如下,有需要的朋友可以关注

本文地址

合集地址

Maven基础

打包流程

Maven是一个常用的构建工具,它可以帮助我们管理项目依赖、编译代码、运行测试和打包应用程序。

  1. 在项目的根目录下,创建一个pom.xml文件,这是Maven项目的核心配置文件。在pom.xml文件中,我们可以定义项目的基本信息、依赖项、插件和构建配置等。
  2. 在pom.xml文件中,定义项目的依赖项。通过在标签中添加所需的依赖项坐标,Maven将会自动下载这些依赖项,并将它们添加到项目的类路径中。
  3. 编译项目。使用Maven的编译插件,可以执行编译操作。执行mvn compile命令,Maven将会编译项目的源代码,并将编译后的类文件保存在target目录下。
  4. 运行测试。Maven具有内置的测试框架支持,可以自动运行项目中定义的测试用例。执行mvn test命令,Maven将会运行项目的测试,并生成测试报告。
  5. 打包应用程序。Maven支持多种打包方式,最常见的是生成可执行的JAR文件或WAR文件。执行mvn package命令,Maven将会根据项目的配置,将编译后的代码、资源文件和依赖项打包到一个可执行的归档文件中。
  6. 生成其他构建产物。除了打包应用程序外,Maven还可以生成其他构建产物,如文档、站点和分发包等。通过配置相应的插件,可以执行mvn installmvn deploy命令,将这些构建产物发布到本地或远程仓库中。

Maven中的命令

Maven提供了许多命令,用于执行各种构建任务和操作。

  1. mvn clean:清理项目目录,删除之前构建生成的目录和文件。
  2. mvn compile:编译项目的源代码,将源代码编译为字节码文件。
  3. mvn test:运行项目的单元测试,执行项目中定义的测试用例。
  4. mvn package:打包应用程序,将项目的编译结果和资源文件打包为可执行的归档文件,如JAR、WAR等。
  5. mvn install:安装构建产物到本地仓库,将打包的应用程序安装到本地Maven仓库,供其他项目引用。
  6. mvn deploy:发布构建产物到远程仓库,将构建产物发布到远程Maven仓库,供其他开发者或其他项目使用。
  7. mvn site:生成项目的站点文档,包括项目报告、测试覆盖率报告等。
  8. mvn dependency:tree:显示项目的依赖树,列出项目的所有依赖项及其传递依赖。
  9. mvn dependency:resolve:解析项目的依赖项,下载并解析项目所需的依赖项。
  10. mvn dependency:purge-local-repository:清理本地仓库中的依赖项,删除本地仓库中不再使用的依赖项。
  11. mvn archetype:generate:生成项目的脚手架,根据模板生成一个新的Maven项目。
  12. mvn release:preparemvn release:perform:用于自动化版本发布的命令,执行版本发布的准备和执行操作。

Maven的工作原理

项目结构和配置

在Maven中,项目通过一个特定的目录结构进行组织,其中包含源代码、资源文件和其他项目元数据。Maven使用项目根目录下的pom.xml文件进行配置,该文件定义了项目的基本信息、依赖项、插件和构建配置等。

坐标和仓库

在Maven中,每个项目都有一个唯一的坐标,它由组织名、项目名和版本号组成。Maven使用这个坐标来标识和管理项目及其依赖项。Maven通过中央仓库(Central Repository)和其他远程或本地仓库来获取和发布项目依赖项。

生命周期和插件

Maven定义了一组标准的构建生命周期,例如clean、compile、test、package和install等。每个生命周期由一系列的构建阶段组成,Maven插件可以绑定到这些阶段,并执行相应的任务。插件可以用于执行编译、测试、打包、部署等各种构建任务。

依赖管理

Maven提供了强大的依赖管理机制。通过在pom.xml文件中定义依赖项坐标,Maven可以自动下载所需的依赖项,并将它们添加到项目的类路径中。Maven还支持传递性依赖,即当一个依赖项依赖其他依赖项时,Maven可以自动解析和下载这些传递性依赖。

构建过程

当执行Maven构建命令时,Maven会根据项目的配置和命令执行相应的构建任务。它会根据生命周期的定义,按照指定的顺序执行各个构建阶段,并调用相应的插件来完成任务。在构建过程中,Maven会处理编译、测试、打包、文档生成等多个环节,并生成相应的构建产物。

Maven中的插件

Maven提供了许多插件,用于执行各种构建任务和增强构建过程。以下是一些在Maven打包中常用的插件:

Maven Compiler Plugin

用于编译Java源代码的插件。它可以配置Java版本、编译参数等,并将源代码编译为字节码文件。

Maven Surefire Plugin

用于运行项目的单元测试的插件。它可以自动运行测试用例,并生成测试报告。

Maven JAR Plugin

用于创建可执行的JAR文件的插件。它可以将编译后的类文件、资源文件和依赖项打包到一个JAR文件中,并指定JAR文件的入口点。

Maven WAR Plugin

用于创建Web应用程序的WAR文件的插件。它可以将Web应用程序的源代码、资源文件和依赖项打包到一个WAR文件中,并可以配置Web应用程序的部署描述符。

Maven Assembly Plugin

用于创建自定义归档文件的插件。它可以根据配置创建各种类型的归档文件,如ZIP、TAR等,可以包含多个文件和目录。

Maven Shade Plugin

用于创建可执行的Uber JAR文件的插件。它可以将项目及其所有依赖项合并为一个大的JAR文件,解决了传统JAR文件的依赖冲突问题。

Maven Dependency Plugin

用于管理和分析项目依赖的插件。它可以列出项目的依赖关系、解析依赖树、下载依赖项等。

Maven Release Plugin

用于自动化版本发布的插件。它可以自动更新版本号、打标签、发布到远程仓库等,简化了版本管理和发布过程。

Maven中的配置

Maven的settings.xml文件是Maven的全局配置文件,它通常位于用户的Maven安装目录下的conf文件夹中。

服务器认证配置

  • <servers>元素:用于配置Maven与远程仓库的身份验证信息,包括仓库ID、用户名和密码等。

本地仓库配置

  • <localRepository>元素:用于指定本地仓库的路径。

代理服务器配置

  • <proxies>元素:用于配置访问远程仓库时的代理服务器,包括代理的协议、主机、端口、用户名和密码等。

镜像仓库配置

  • <mirrors>元素:用于配置镜像仓库,可以指定替代官方远程仓库的镜像仓库,加快下载速度。

全局依赖配置

  • <profiles>元素:用于定义不同的构建配置文件,可以包含不同的依赖项、插件配置等。

除了上述配置外,settings.xml文件还包含一些其他配置选项,如:

  • offline:设置是否离线模式,禁止从远程仓库下载依赖项。
  • mirrors:定义镜像仓库的详细配置。
  • profiles:定义构建配置文件的详细配置。
  • activeProfiles:定义激活的构建配置文件。

Maven中配置多个仓库

配置

在Maven的配置文件(settings.xml)中,你可以配置多个仓库。下面是一种常见的配置方式:

<settings>
  <profiles>
    <profile>
      <id>repo1</id>
      <repositories>
        <repository>
          <id>central</id>
          <url>https://repo1.example.com/maven-central</url>
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>false</enabled>
          </snapshots>
        </repository>
      </repositories>
    </profile>
    <profile>
      <id>repo2</id>
      <repositories>
        <repository>
          <id>custom</id>
          <url>https://repo2.example.com/maven-custom</url>
          <releases>
            <enabled>true</enabled>
          </releases>
          <snapshots>
            <enabled>true</enabled>
          </snapshots>
        </repository>
      </repositories>
    </profile>
  </profiles>
  <activeProfiles>
    <activeProfile>repo1</activeProfile>
    <activeProfile>repo2</activeProfile>
  </activeProfiles>
</settings>

在上述配置中,我们定义了两个配置文件(profiles),分别是repo1repo2。每个配置文件中可以定义一个或多个仓库(repositories)。

每个仓库配置包括以下信息:

  • <id>:仓库的唯一标识符。
  • <url>:仓库的URL地址。
  • <releases>:配置该仓库是否可用于发布版(release)依赖项。
  • <snapshots>:配置该仓库是否可用于快照版(snapshot)依赖项。

<activeProfiles>中,我们指定了要激活的配置文件,这样Maven在构建过程中将会使用这些配置文件中定义的仓库。

通过配置多个仓库,你可以同时使用多个远程仓库,从中获取所需的依赖项。这在项目中可能会有多个团队或多个依赖来源的情况下非常有用。

使用

如果你在settings.xml中配置了多个仓库,并想在pom.xml文件中使用其中某个仓库,可以通过在pom.xml的<repositories>元素中指定该仓库的ID来引用它。以下是一个示例:

<project>
  ...
  <repositories>
    <repository>
      <id>central</id>
      <url>https://repo1.example.com/maven-central</url>
    </repository>
    <repository>
      <id>custom</id>
      <url>https://repo2.example.com/maven-custom</url>
    </repository>
  </repositories>
  ...
</project>

在上述示例中,<repositories>元素包含了两个<repository>子元素,分别引用了ID为"central"和"custom"的仓库。这些ID需要与settings.xml中配置的仓库ID对应。

在使用这些仓库时,Maven将会根据配置的仓库ID在settings.xml中查找相应的仓库配置,并使用其中定义的URL地址来获取依赖项。

请注意,如果在pom.xml中指定了仓库,那么将优先使用pom.xml中的配置,而不会使用settings.xml中的配置。因此,如果你只想使用settings.xml中的仓库配置,可以不在pom.xml中定义<repositories>元素。

本文使用 mdnice 排版